4

USE ステートメントは MS SQL Server 2008R2 でコンパイルされているようです。

例えば、

if(1=0)
begin
   USE MyDB
end

USE MyDBIF文を無視して実行すると結果がでます。

条件付きで動作するように変更するにはどうすればよいですか?

PSも試しexecute sp_executesql N'USE [MyDB]'ましたが、条件で動作しますが、現在のコンテキストは変更されません。

4

3 に答える 3

2

実際、実行時にデータベースを変更する正しい方法は、まさに動的 SQL であり、実際に実行されるまでコンパイルも検証もされません。実際に関与sp_executesqlするサンプルの失敗したコードはコンテキストを変更しますが、問題は、呼び出し元のコードではなく、動的 SQL バッチに対してのみ変更が有効であることです。そのデータベースを実際に見て使用するには、さらにコードを動的 SQL ブロックEXECに配置し、 /によって一度に実行する必要がありsp_executesqlます。

USE master ;
EXEC (N'USE tempdb ; PRINT db_name() ;') ;
PRINT db_name() ;

1=0その動的なデータベース切り替えを絶対に行う必要がある場合は、スクリプトをリファクタリングして、実行するコマンドを含む文字列のみを作成し、その条件のみを使用するデータベースを選択するための適切なUSEステートメントを先頭に追加することができると思います。

于 2013-08-10T20:20:45.773 に答える
1

条件付きの「Use MyDB」が必要な場合は、sqlcmd と変数を調べます。

Use $(DatabaseName) 
GO 

これが、「動的な」Use MyDatabase 名を取得する唯一の方法です。

参考記事:

technet.microsoft.com/en-us/library/ms188714.aspx

于 2013-08-19T19:24:14.757 に答える
0

この方法で動的 SQL を試してください。

EXEC ('USE [MyDB];')
于 2013-08-10T08:56:32.830 に答える