0

zhm.GetBatchCmdList_sp2 つのオプションの入力パラメータ (@freqおよび)を持つストアド プロシージャ ( ) があります@env。ストアド プロシージャは、実行したい SSIS ファイルとストアド プロシージャの 1 列のリストを 1 つずつ返します。

ストアド プロシージャの結果セットをコンソールにエコーするだけのテスト コードをいくつか作成しました。

set freq=D
set env=DEV
set cmd=sqlcmd -S LDNDSM05243\TDS_MAIN2_DEV -d CPRM_3DSTRESS -Q "exec zhm.GetBatchCmdList_sp @freq=$(freq), @freq=$(env)" -h -1
set cmdList=
setlocal enabledelayedexpansion
for /f "usebackq" %%i in (`"%cmd%"`) do (set cmdList=!cmdList! %%i)
for %%v in (%cmdList%) do echo %%v
endlocal

しかし、私はそれに問題があります。

上記の「set cmd....」行から入力パラメーターを削除すると、次のように置き換えられます。

set cmd=sqlcmd -S LDNDSM05243\TDS_MAIN2_DEV -d CPRM_3DSTRESS -Q "exec zhm.GetBatchCmdList_sp" -h -1

その後、スクリプトが実行されます。ただし、実行時にとの異なる値を設定できるように、呼び出し元が入力変数 (つまり%1%2) をスクリプトに渡して (これらをストアド プロシージャに渡す)ことができるようにしたいと考えています。 freqenv

何が間違っているのかわかりませんが、格納された proc 入力パラメーターと遅延展開の有効化の組み合わせに関係があるのではないかと思います。もちろん、私は間違っている可能性がありますが、グーグルで調べてみましたが、このコンボ/質問に固有のヘルプが見つかりません.

誰でも私を助けてもらえますか?

4

1 に答える 1

1

編集 - これは完全に書き直された回答です

あなたの問題は、)cmdの定義にあります。2 つの引用符のセットがあり、1 つは元の定義にあり、もう 1 つのセットは FOR IN() 句にあります。最終的な効果は、)文字が引用符で囲まれていないため、IN() 句が途中で終了し、ステートメントが失敗することです。

コメントで述べたように、に変更する"!cmd!"と問題が解決します。しかし、IN() 句から引用符を削除するだけで解決できたと思います。

for /f "usebackq" %%i in (`%cmd%`) do...
于 2012-10-05T12:46:49.590 に答える