6

USE DATABASEステートメントを持つスクリプトがあります。データベースが存在する場合、スクリプトは問題なく実行されます。存在しない場合は、「データベースが存在しません」というメッセージで失敗します。これは完全に理にかなっています。

さて、失敗しないように、DB が sys.databases に存在するかどうかを選択するチェックを追加しました (IF 1=2簡単にするために、ここではチェックで表します)。したがって、DB が存在する場合 (1=1 )、「use」ステートメントを実行します。

驚いたことに、スクリプトは失敗し続けました。そこで、TRY CATCH ブロックを追加してみました。同じ結果です。use ステートメントが他の何よりも先に評価されるようです。これは、スクリプトが壊れる可能性があるため、非常に面倒です。

だから私の質問は、use存在しない可能性のあるデータベースへのスクリプトでステートメントを作成するにはどうすればよいですか?

BEGIN TRY
   IF (1=1) BEGIN --if DB exists
    USE DB_THAT_MAY_NOT_EXIST
   END 
END TRY
BEGIN CATCH
END CATCH
4

3 に答える 3

5

やりたいことができるとは思いません。ドキュメントには、コンパイル時と実行時の両方useで実行されることが指定されています。

そのため、use存在しないデータベースでは、コンパイル時エラーが発生します。コンパイル時のエラーを回避する方法を知りません。

別の答えが示唆するように、すべての名前でデータベース修飾子を使用してください。

データベースに切り替えずに、データベースが存在するかどうかを確認することもできます。これが1つの方法です:

begin try
    exec('use dum');
    print 'database exists'
end try
begin catch
    print 'database does not exist'
end catch
于 2013-01-07T16:51:59.127 に答える
3

これはどう?この方法でチェックインできるかもしれません。

if db_id('dbname') is not null
 -- do stuff

またはこれを試してください:

if not exists(select * from sys.databases where name = 'dbname')
    -- do stuff

テーブルの場合:

if object_id('objectname', 'somename') is not null 

また

sp_msforeachdb ‘select * from ?.sys.tables’

参照

于 2013-01-07T16:46:33.663 に答える
1

私の頭の上から、USEステートメントを避けるためにすべての参照を完全に修飾することができます. 誰かがより少ない PT を必要とする解決策を考え出すことを願っています。

DBが存在するかどうかを確認した後、代わりに

SELECT Moo FROM MyTable

使用する

SELECT Moo FROM MyDB.MySchema.MyTable
于 2013-01-07T16:47:23.580 に答える