2013-07-02 2 views
1

У меня есть клиент - настольный сервер приложений (.NET) и клиент должен получить список доступных резервных копий файлов, хранящихся в неплатеже резервное копирование папки (C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup)SQL Server 2012: получить список доступных резервных копий

я решил создать хранимую процедуру, которая будет возвращать таблицу со всеми необходимыми файлами:

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 

Но я получаю следующее сообщение об ошибке:

Msg 0, Level 11, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.

Вы можете Tr y этот скрипт на вашей машине ...

В чем проблема?

Есть ли другой способ получить список доступных резервных копий (может быть, используется библиотека SMO)?

+0

Итак, вы хотели список резервных файлов, которые не отслеживаются сервером sql? Если вы хотите, чтобы список файлов резервных копий, о которых знает сервер sql (например, из вашего плана обслуживания или чего нет), вы можете просто запросить таблицу 'backupfile' в базе данных' msdb' –

+0

Обратите внимание, что 'xp_dirtree' недокументирован и неподдерживается , –

+0

Darren Kopp => Да, я знаю об этих таблицах (backupfile, backupmediafamily, backupset), но эти таблицы не синхронизированы с папками, это просто история –

ответ

2

Это связано с тем, как вы передаете FilePath к 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 
+0

Спасибо !!! Прекрасно работает!!! –

Смежные вопросы