9

私は完全に困惑しています。次のブロックがあります。

IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'Test')
BEGIN
    CREATE SCHEMA Test;
END;

これを SQL Server 2008 に対して実行すると、「メッセージ 156、レベル 15、状態 1、行 3: キーワード 'SCHEMA' 付近の構文が正しくありません」というメッセージが表示されますが、CREATE SCHEMAコマンドだけを単独で実行すると機能します。

また、これは機能します:

IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'Test')
BEGIN
    PRINT 'CREATE GOES HERE';
END;

私は何を間違っていますか?

4

4 に答える 4

23

エラーメッセージは、ここではちょっとしたニシンです....次を実行して、「実際の」エラーが何であるかを確認します。

SELECT * FROM sys.schemas
CREATE SCHEMA Test

メッセージ 111、レベル 15、状態 1、行 2

'CREATE SCHEMA' はクエリ バッチの最初のステートメントである必要があります。

この問題を回避するには、次のEXEC関数を使用できます。

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Test')
  BEGIN
    EXEC ('CREATE SCHEMA Test;');
  END;
于 2013-09-09T11:52:23.207 に答える
4

これを試してみてください -

IF NOT EXISTS(SELECT 1 FROM sys.schemas WHERE name = 'Test')
BEGIN
    EXEC sys.sp_executesql N'CREATE SCHEMA Test;'
END
于 2013-09-09T12:30:10.783 に答える
4

そのようにスキーマが存在するかどうかを確認することはできません。そのようにする必要があります。

IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'Test')
BEGIN
    execute('CREATE SCHEMA Test');
END;

その理由は、DB エンジンはコードを実行する前にコンパイルしますが、コードのロジックを検証しないためです。エンジンのコンパイル中に、エラーが発生するよりもスキーマが既に存在することがわかります。DBは動的SQLをコンパイルしないため、既存のスキーマを作成しようとしていることがわかりません。

于 2013-09-09T11:51:51.470 に答える