2016-08-18 7 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)キーワード 'の近くに 構文が正しくありません。このステートメントが共通テーブル 式、xmlnamespaces句または変更トラッキングコンテキスト 句である場合、前のステートメントはセミコロンで終了する必要があります。

私はこれを1つのデータベースのバックアップに書き直すと成功しました。私は 'Exec sp_msforeachdb'ステートメントをPRINT()の中に入れて実行すると、すべてが正しいように見えます。

+0

「Exec sp_msforeachdb」ステートメントをSSMSで直接実行しようとするとどうなりますか? –

+0

不要なアポストロフィの余分なセットを削除した後(@commandパラメータ文字列の中にある)、SQL Serverは上記のエラーをデータベースごとに1回出力します。 –

+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 
関連する問題