1

クライアント - サーバー デスクトップ アプリケーション (.NET) があり、クライアントはデフォルトのバックアップ フォルダ ( C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup)に保存されている使用可能なバックアップ ファイルのリストを取得する必要があります。

必要なすべてのファイルを含むテーブルを返すストアド プロシージャを作成することにしました。

CREATE PROCEDURE [dbo].[spGetBackUpFiles] AS 
SET NOCOUNT ON
BEGIN

declare @backUpPath as table 
(
 name nvarchar(max),
 backuppath nvarchar(max)
)

insert into @backUpPath
EXECUTE [master].dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',    N'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory'

declare @table as table 
(
 filename nvarchar(max),
 depth int,
 filefile int
)

declare @backUpFilesPath as nvarchar(max) = (select top 1 backuppath from @backUpPath)

insert into @table
 EXEC xp_dirtree @backUpFilesPath, 1, 1

SELECT * FROM @table WHERE filename like N'MASK[_]%'
END

しかし、次のエラーが発生します。

メッセージ 0、レベル 11、状態 0、行 0
現在のコマンドで重大なエラーが発生しました。結果がある場合は、破棄する必要があります。

あなたのマシンでこのスクリプトを試すことができます...

何が問題になる可能性がありますか?

利用可能なバックアップのリストを取得する別の方法はありますか (SMO ライブラリを使用している可能性があります)?

4

1 に答える 1

2

ファイルパスを xp_dirtree に渡す方法に関係しています。それを機能させる唯一の方法は、次のように一時テーブルと動的 SQL を使用することでした。

CREATE PROCEDURE [dbo].[spGetBackUpFiles]
AS 
    SET NOCOUNT ON
    BEGIN

        IF OBJECT_ID('tempdb..#table') IS NOT NULL 
            DROP TABLE #table

        CREATE TABLE #table
            (
              [filename] NVARCHAR(MAX) ,
              depth INT ,
              filefile INT
            )

        DECLARE @backUpPath AS TABLE
            (
              name NVARCHAR(MAX) ,
              backuppath VARCHAR(256)
            )

        DECLARE @SQL NVARCHAR(MAX)

        INSERT  INTO @backUpPath
                EXECUTE [master].dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',
                    N'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer',
                    N'BackupDirectory'

        DECLARE @backUpFilesPath AS NVARCHAR(MAX) = ( SELECT TOP 1
                                                              backuppath
                                                      FROM    @backUpPath
                                                    )



        SET @SQL = 'insert into #table
        EXEC xp_dirtree ''' + @backUpFilesPath + ''', 1, 1'

        EXEC(@SQL)

        SELECT  *
        FROM    #table WHERE [filename] like N'MASK[_]%'
        DROP TABLE #table
    END
于 2013-07-03T13:13:02.027 に答える