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

时间:2016-08-18 14:48:37

标签: sql-server tsql escaping sql-server-agent

尝试在代理作业步骤中使用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

执行时我得到以下内容:

  

'+'附近的语法不正确。 [SQLSTATE 42000](错误102)不正确   关键字'with'附近的语法。如果此语句是公用表   表达式,xmlnamespaces子句或更改跟踪上下文   子句,前一个语句必须以分号结束。

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

1 个答案:

答案 0 :(得分:0)

当你在TO URL子句中连接一个字符串时,事实证明BACKUP DATABASE并不适合。这很有效:

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