如何在 RESTORE FILELISTONLY 中使用变量

Cra*_*ein 5 sql-server restore

将 RESTORE FILELISTONLY 的结果存储在名为 #filepaths 的临时表中。

IF object_id('sp_restore') IS NOT NULL
    drop procedure sp_restore
    go

CREATE PROCEDURE sp_restore AS
BEGIN
    RESTORE FILELISTONLY FROM DISK = 'Z:\BACKUPS\my_database_backup.bak'
END
GO

insert into #filepaths 
exec sp_restore
Run Code Online (Sandbox Code Playgroud)

如何将 'Z:\BACKUPS\my_database_backup.bak' 放入变量中?使脚本看起来与此类似。

DECLARE @BACKUP_PATH as nvarchar(max) = 'Z:\BACKUPS\my_database_backup.bak'

IF object_id('sp_restore') IS NOT NULL
    drop procedure sp_restore
    go

CREATE PROCEDURE sp_restore AS
BEGIN
    RESTORE FILELISTONLY FROM DISK = @BACKUP_PATH
END
GO

insert into #filepaths 
exec sp_restore
Run Code Online (Sandbox Code Playgroud)

谢谢,克雷格

Aar*_*and 8

我觉得你的事情有点乱。怎么样:

CREATE PROCEDURE dbo.usp_restore
  @backup_path NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;
    RESTORE FILELISTONLY FROM DISK = @backup_path;
END
GO
Run Code Online (Sandbox Code Playgroud)

创建过程应该与任何单独的调用完全分开。所以在另一个窗口,或者两周后,你应该能够做到这一点(同样,完全独立于存储过程的创建):

DECLARE @bp NVARCHAR(MAX) = N'Z:\BACKUPS\my_database_backup.bak';

INSERT #filepaths EXEC dbo.usp_restore @backup_path = @bp;
Run Code Online (Sandbox Code Playgroud)

您应该查看其他一些评论:


如果您不希望存储过程对此有所帮助(为什么不呢?),请确保您可以以更混乱的方式执行此操作。假设您已经有一个 #temp 表,#t使用正确的列和数据类型创建:

DECLARE @path NVARCHAR(MAX) = N'Z:\BACKUPS\my_database_backup.bak';

DECLARE @sql NVARCHAR(MAX) = N'RESTORE FILELISTONLY FROM DISK = @path;';

INSERT #t EXEC master.sys.sp_executesql @sql, N'@path NVARCHAR(MAX)', @path;
Run Code Online (Sandbox Code Playgroud)

但是,为什么不在需要时准备一个存储过程,而不是移植所有这些庞大的代码呢?