4

この質問への回答を検索しているときに、StackOverflowでこの人気のある投稿を見つけました。残念ながら、完全には機能しません。質問はこれです:

変更(例)を実行する前に、テーブル(または別のオブジェクト)の存在を確認する方法はありますINSERTか?前述の投稿はこれを示唆しています:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'dbo' 
                 AND  TABLE_NAME = 'questionableTable'))
BEGIN
    INSERT INTO dbo.questionableTable VALUES ('success!');
END

エラー:Invalid object name 'dbo.questionableTable'.

INSERTこれに伴う問題は、SQL Serverがステートメントを解析するときに失敗し、それdbo.questionableTableが存在しないことを示していることです。前のINFORMATION_SCHEMAチェックはそれに影響を与えていないようです。

この種のクエリを書く方法はありますか?特にSQLServerの場合。しかし、そのようなものが存在する場合は、他のデータベースシステムでも同様の操作を行いたいと思います。

この質問の背後にある動機は、互いのテーブルのサブセットを含む複数のデータベースがあるためです。私が望んでいるのは、すべてのデータベースに適用でき、そこに存在するテーブルのみを変更する(実行時にエラーが発生しない)単一のスクリプトを作成することです。

4

2 に答える 2

5

関数を介して動的SQL を使用します。EXEC()

IF (EXISTS (SELECT * 
            FROM INFORMATION_SCHEMA.TABLES 
            WHERE TABLE_SCHEMA = 'dbo' 
            AND TABLE_NAME = 'questionableTable'))
BEGIN
    EXEC('INSERT INTO dbo.questionableTable VALUES (''success!'')');
END

このEXEC()関数は文字列を SQL として実行しますが、文字列であるため、実行されるまで評価されないため、文字列で言及されているテーブルはコンパイル時に存在する必要はありません。これにより、テーブルを作成するにストアド プロシージャを定義できます。

于 2012-05-18T23:43:30.383 に答える
0

これをローカルサーバーでテストしたところ、うまくいくようです:

if exists (select * from dbname.sys.tables where name='tablename')
begin
select * from dbname.dbo.tablename
end
于 2012-05-18T23:42:20.530 に答える