Попытка сделать Drop и Restore динамическими для переменной базы данных - PullRequest
0 голосов
/ 25 марта 2019

Вы знаете, как в SQL Server можно щелкнуть правой кнопкой мыши таблицу и выбрать генерацию drop and create sql, а также генерацию restore sql? Вот что я перечислил ниже. Первый список жестко запрограммирован для работы с одной базой данных. И второй список - моя попытка, которая не работает. Синтаксическая ошибка рядом с первым символом +.

Работает

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'pubs'
GO
use [pubs]

GO
use [master]

GO
USE [master]
GO
ALTER DATABASE [pubs] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
/****** Object:  Database [pubs]    Script Date: 3/25/2019 2:58:04 PM ******/
DROP DATABASE [pubs]
GO
RESTORE DATABASE [pubs] FROM  DISK = N'C:\Users\RSantia\pubs.bak' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5
GO

Моя попытка

DECLARE @lib nvarchar(500) = 'pubs'

EXECUTE sp_executesql

N'EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = ' + '''' + @lib + '''' +
'GO
use ' + @lib + 
'GO
use [master]
GO
USE [master]
GO
ALTER DATABASE ' + @lib + ' SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
/****** Object:  Database [rstestdb100]    Script Date: 3/25/2019 2:58:04 PM ******/
DROP DATABASE ' + @lib + 
'GO
RESTORE DATABASE ' + @lib + ' FROM  DISK = C:\Users\RSantia\' + @lib + '.bak WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5
GO'

1 Ответ

2 голосов
/ 25 марта 2019

Когда я делаю большие динамические операторы SQL, такие как этот, я сохраняю сгенерированный оператор в переменной NVARCHAR(MAX) и затем ПЕЧАТАЮ его перед попыткой выполнить.Затем вы можете проанализировать сгенерированный оператор на наличие синтаксических ошибок, которые приведут вас к падению динамического SQL.Например:

DECLARE @lib nvarchar(500) = 'pubs'

DECLARE @SQL NVARCHAR(MAX) = 

N'EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = ' + '''' + @lib + '''' +
'GO
use ' + @lib + 
'GO
use [master]
GO
USE [master]
GO
ALTER DATABASE ' + @lib + ' SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
/****** Object:  Database [rstestdb100]    Script Date: 3/25/2019 2:58:04 PM ******/
DROP DATABASE ' + @lib + 
'GO
RESTORE DATABASE ' + @lib + ' FROM  DISK = C:\Users\RSantia\' + @lib + '.bak WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5
GO'

PRINT @SQL

Ваш сгенерированный оператор SQL выглядит следующим образом:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = 'pubs'GO
use pubsGO
use [master]
GO
USE [master]
GO
ALTER DATABASE pubs SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
/****** Object:  Database [rstestdb100]    Script Date: 3/25/2019 2:58:04 PM ******/
DROP DATABASE pubsGO
RESTORE DATABASE pubs FROM  DISK = C:\Users\RSantia\pubs.bak WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5
GO

Вы можете легко увидеть, что ваши сгенерированные операторы имеют некоторые ошибки.Помните, что только то, что ваш скрипт имеет возврат каретки, не означает, что генерирующий SQL также будет иметь их.

Я думаю, что это, вероятно, то, что вы хотите:

DECLARE @lib nvarchar(500) = 'pubs'

DECLARE @SQL NVARCHAR(MAX) = 

N'EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = ' + '''' + @lib + '''
GO
use ' + @lib + '
GO
use [master]
GO
USE [master]
GO
ALTER DATABASE ' + @lib + ' SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
/****** Object:  Database [rstestdb100]    Script Date: 3/25/2019 2:58:04 PM ******/
DROP DATABASE ' + @lib + 
'GO
RESTORE DATABASE ' + @lib + ' FROM  DISK = C:\Users\RSantia\' + @lib + '.bak WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5
GO'

EXEC sys.sp_executesql @SQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...