2016-11-29 7 views
0

У меня есть следующий скрипт для восстановления базы данных. На линии, которая говорит:Сценарий восстановления базы данных говорит Не удается открыть устройство резервного копирования, когда путь передан FROM DISK с использованием переменной

FROM DISK = @backup_location --N'C:\Temp\TempDB.bak'

Если я использую переменную @backup_location, как указано выше, она завершается с ошибкой:

Msg 3201, Level 16, State 2, Line 24 Cannot open backup device 'C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\Backup\C'. Operating system error 2(The system cannot find the file specified.). Msg 3013, Level 16, State 1, Line 24 RESTORE DATABASE is terminating abnormally.

Если я жесткий код местоположение с помощью:

FROM DISK = N'C:\Temp\TempDB.bak'

Он отлично работает.

Как я могу использовать переменную для указания пути к базе данных?

USE [master] 

Go 

-- DECLARE VARIABLES: 
DECLARE @dbname SYSNAME 
DECLARE @backup_location VARCHAR 

SET @dbname = 'TempDB'; 
SET @backup_location = N'C:\Temp\TempDB.bak'; 

-- BEGIN: KILL ACTIVE CONNECTIONS 
Declare @spid int 
Select @spid = min(spid) from master.dbo.sysprocesses 
where dbid = db_id(@dbname) 
While @spid Is Not Null 
Begin 
     Execute ('Kill ' + @spid) 
     Select @spid = min(spid) from master.dbo.sysprocesses 
     where dbid = db_id(@dbname) and spid > @spid 
End 
-- END: KILL ACTIVE CONNECTIONS 

-- RESTORE DB: 
RESTORE DATABASE @dbname 
    FROM DISK = @backup_location --N'C:\Temp\TempDB.bak' 
    WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 5 

Go 

Спасибо за ваше время.

ответ

0

Изменить последние несколько строк:

-- RESTORE DB: 
declare @statement varchar(max) 
--allow for quotation marks in @backup_location 
select @statement = 
    'RESTORE DATABASE ' + @dbname + 
    'FROM DISK = ''' + replace(@backup_location, '''', '''''') + 
    'WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 5' 
exec (@statement) 
0

@codenoir, спасибо за ответ. Как только я увидел ваш varchar (max), я изменил объявление переменной @backup_location на то же самое, и он работал без необходимости exec.

Так окончательный код был:

USE [master] 

GO 

-- DECLARE VARIABLES: 
DECLARE @dbname SYSNAME 
DECLARE @backup_location VARCHAR(MAX) 

SET @dbname = 'TestDB'; 
SET @backup_location = N'C:\Temp\TestDB.bak'; 

-- BEGIN: KILL ACTIVE CONNECTIONS 
DECLARE @spid INT 
SELECT @spid = MIN(spid) FROM master.dbo.sysprocesses 
WHERE dbid = DB_ID(@dbname) 
WHILE @spid Is Not Null 
BEGIN 
     EXECUTE ('Kill ' + @spid) 
     SELECT @spid = MIN(spid) FROM master.dbo.sysprocesses 
     WHERE dbid = db_id(@dbname) and spid > @spid 
END 
-- END: KILL ACTIVE CONNECTIONS 

-- RESTORE DB: 
RESTORE DATABASE @dbname 
    FROM DISK = @backup_location 
    WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 5 

Go