2016-08-18 113 views
-1

我在尝试在代理作业步骤中使用sp_msforeachdb未记录的过程时遇到问题。这里是我的脚本来创建作业步骤: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

当您尝试直接在SSMS执行'Exec sp_msforeachdb'语句会发生什么? –

+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