USE ステートメントは MS SQL Server 2008R2 でコンパイルされているようです。
例えば、
if(1=0)
begin
USE MyDB
end
USE MyDB
IF文を無視して実行すると結果がでます。
条件付きで動作するように変更するにはどうすればよいですか?
PSも試しexecute sp_executesql N'USE [MyDB]'
ましたが、条件で動作しますが、現在のコンテキストは変更されません。
USE ステートメントは MS SQL Server 2008R2 でコンパイルされているようです。
例えば、
if(1=0)
begin
USE MyDB
end
USE MyDB
IF文を無視して実行すると結果がでます。
条件付きで動作するように変更するにはどうすればよいですか?
PSも試しexecute sp_executesql N'USE [MyDB]'
ましたが、条件で動作しますが、現在のコンテキストは変更されません。
実際、実行時にデータベースを変更する正しい方法は、まさに動的 SQL であり、実際に実行されるまでコンパイルも検証もされません。実際に関与sp_executesql
するサンプルの失敗したコードはコンテキストを変更しますが、問題は、呼び出し元のコードではなく、動的 SQL バッチに対してのみ変更が有効であることです。そのデータベースを実際に見て使用するには、さらにコードを動的 SQL ブロック内EXEC
に配置し、 /によって一度に実行する必要がありsp_executesql
ます。
USE master ;
EXEC (N'USE tempdb ; PRINT db_name() ;') ;
PRINT db_name() ;
1=0
その動的なデータベース切り替えを絶対に行う必要がある場合は、スクリプトをリファクタリングして、実行するコマンドを含む文字列のみを作成し、その条件のみを使用するデータベースを選択するための適切なUSE
ステートメントを先頭に追加することができると思います。
条件付きの「Use MyDB」が必要な場合は、sqlcmd と変数を調べます。
Use $(DatabaseName)
GO
これが、「動的な」Use MyDatabase 名を取得する唯一の方法です。
参考記事:
この方法で動的 SQL を試してください。
EXEC ('USE [MyDB];')