2016-08-18 3 views
-1

У меня возникла проблема при попытке использовать недокументированную процедуру sp_msforeachdb на этапе задания агента. Вот мой сценарий, чтобы создать шаг задания:Проблема с символом Escape внутри этапа задания агента SQL

EXEC sp_add_jobstep 
    @job_name = N'Weekly Blob Backup', 
    @step_name = N'Run Backup', 
    @subsystem = N'TSQL', 
    @command = N'EXEC sp_msforeachdb '' BACKUP DATABASE [?] TO URL = ''''http://urlgoeshere.blob.core.windows.net/subfolder/SIMSPROCESSOR1_'''' + ''''?'''' + ''''_'''' + CONVERT(VARCHAR(8), CAST(GETDATE() AS DATE), 112) + ''''.bak'''' WITH COMPRESSION, CREDENTIAL = ''''SQLBlobStorageCredential''''''', 
    @retry_attempts = 0, 
    @retry_interval = 0 

При выполнении я получаю следующее:

Неправильный синтаксис около «+». [SQLSTATE 42000] (Ошибка 102) Неверный синтаксис рядом с ключевым словом 'with'. Если этот оператор представляет собой общую таблицу выражение, предложение xmlnamespaces или контекст отслеживания изменений , предыдущий оператор должен быть прерван точкой с запятой.

Успешное повторное создание этого файла для резервного копирования одной базы данных. Ясно, что что-то не так с экранированием символов, но когда я помещаю выражение Exec sp_msforeachdb в PRINT() и выполняю его, все выглядит правильно.

+0

Что происходит, когда вы пытаетесь ВЫПОЛНИТЬ инструкцию Exec sp_msforeachdb непосредственно в SSMS? –

+0

После удаления дополнительных наборов апострофов, которые больше не требуются (изнутри строки параметров @command), SQL Server выводит те же ошибки, что и выше, один раз для каждой базы данных. –

+0

Я думаю, что, возможно, все те места, где у вас есть 4 одинарных кавычки, возможно, вам нужно только 2. Теперь, когда вы знаете, что ошибка не из-за задания, вы можете играть с ней в SSMS до тех пор, пока она не исполнится, а затем одна и та же строка должна работайте отлично в работе. –

ответ

0

Оказывается, BACKUP DATABASE не нравится, когда вы объединяете строку в предложении TO URL. Это сработало:

EXEC sp_add_jobstep 
    @job_name = N'Weekly Blob Backup', 
    @step_name = N'Run Backup', 
    @subsystem = N'TSQL', 
    @command = N'EXEC sp_msforeachdb ''DECLARE @url NVARCHAR(500) = N''''http://urlgoeshere.blob.core.windows.net/simsstorage/'''' + SUBSTRING(@@SERVERNAME, CHARINDEX(''''\'''', @@SERVERNAME, 1) +1, 100) + ''''_'''' + N''''?'''' + N''''_'''' + CONVERT(NVARCHAR(8), CAST(GETDATE() AS DATE), 112) + N''''.bak'''' BACKUP DATABASE [?] TO URL = @url WITH COMPRESSION, CREDENTIAL = ''''SQLBlobStorageCredential''''''', 
    @retry_attempts = 0, 
    @retry_interval = 0