SQL 代理作业步骤中的转义字符问题

Escape character issue inside SQL Agent job step

我在代理作业步骤中尝试使用 sp_msforeachdb 未记录的过程时遇到问题。这是我创建作业步骤的脚本:

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

执行时我得到以下信息:

Incorrect syntax near '+'. [SQLSTATE 42000] (Error 102) Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

我重写这个来备份单个数据库时成功了。显然转义字符有些不对劲,但是当我将 'Exec sp_msforeachdb' 语句放入 PRINT() 并执行它时,一切看起来都是正确的。

原来 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