Когда я делаю большие динамические операторы 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