1

ディレクトリ内のSQLファイルごとにSQLCMDを実行するバッチファイルがあります。

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U user -P password -E -i"%%G"

しかし、私はなりすましを利用する必要があり、各ファイルにこの行を入れたくありません。私は2つの可能な解決策を試しました。

解決策1:

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U user -P password -E -q "EXECUTE AS LOGIN = 'user2'" -i"%%G" -q "REVERT"

解決策2:解決策2:

sqlcmd /S servername /d databaseName -U user -P password -E -q "EXECUTE AS LOGIN = 'user2'"
for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U user -P password -E -i"%%G" 
sqlcmd /S servername /d databaseName -U user -P password -E -q "REVERT"

しかし、両方のソリューションが機能していません。この状況で何をしますか?

4

1 に答える 1

1

マニュアルから:

-i 入力ファイル[,入力ファイル 2 ...]

SQL ステートメントまたはストアド プロシージャのバッチを含むファイルを識別します。[...] -i オプションと -Q/-q オプションは相互に排他的です。

したがって、このように使用することはできませんsqlcmd。ただし、代わりにこのユーティリティを使用できますが、osqlこの制限はないようですが、いずれかのソリューションですべてのsqlcmdエントリを置き換えるだけでは機能しません。osql

2 番目の方法EXECUTE ASは、現在のセッションまたは現在のモジュールである のスコープのため、またはREVERTが実行されるまで機能しません。を呼び出すたびにosql新しいセッションが開始されるためEXECUTE AS、スクリプトから個別に呼び出しても影響はありません。

最初の解決策は、スクリプトの前にosql両方の-qコマンドを実行するため、機能しません。-iしたがって、実行コンテキスト変更することと、スクリプトの前に戻すことの両方を効果的に行うことができます。

REVERTただし、すべてのスクリプトの実行の最後に明示的に呼び出す必要はありません。したがって、最初の解決策を取り、 に置き換えsqlcmd、ビットをosql取り外して、残っているものを使用してください。-q "REVERT"

于 2013-01-23T13:45:32.653 に答える