sql >> データベース >  >> RDS >> Sqlserver

SQL Serverエラー111:「…クエリバッチの最初のステートメントである必要があります」

    SQL Serverでは、バッチは、実行のためにアプリケーションからSQLServerに同時に送信される1つ以上のT-SQLステートメントのグループです。

    次のようなエラーが発生した場合:

    Msg 111, Level 15, State 1, Line 2
    'CREATE VIEW' must be the first statement in a query batch.

    おそらく、ステートメントを同じバッチ内の他のステートメントと組み合わせているためです。これは、バッチでは許可されていません。

    エラーメッセージの最初の部分は、バッチで使用している実際のステートメントによって異なります。私の場合はCREATE VIEW 、ただし、CREATE PROCEDUREと同じくらい簡単にできます。 、CREATE FUNCTION 、など、使用しているステートメントの場合。

    このエラーの原因となるコードの例を次に示します。

    DROP VIEW IF EXISTS vAllCustomers;
    
    CREATE VIEW vAllCustomers AS
    SELECT * FROM Customers;

    結果:

    Msg 111, Level 15, State 1, Line 3
    'CREATE VIEW' must be the first statement in a query batch.

    私の場合、2つのステートメントを実行しようとしています。 DROP VIEW ステートメントとCREATE VIEW ステートメント。

    T-SQLバッチのルールでは、CREATE VIEW ステートメントを同じバッチ内の他のステートメントと組み合わせることはできません。

    つまり、CREATE VIEW バッチ内の唯一のステートメントにすることができます。

    エラーを修正する方法

    最初のステートメントの後にバッチセパレータを追加するだけで、上記のエラーを修正できます。

    SQL Serverでは、GO キーワードはバッチの終了を示します。具体的には、SQLServerユーティリティはGOを解釈します T-SQLステートメントの現在のバッチをSQLServerのインスタンスに送信する必要があることを示すシグナルとして。

    したがって、前のステートメントを次のように変更できます:

    DROP VIEW IF EXISTS vAllCustomers;
    GO
    CREATE VIEW vAllCustomers AS
    SELECT * FROM Customers;
    GO

    GOを追加する ステートメントを2つの別々のバッチに分割することにより、問題を修正します。

    GOに注意してください 実際にはT-SQLの一部ではありません。これは、ステートメントをバッチに分割する目的でSQLServerユーティリティによって認識されるコマンドです。

    SQL Serverへの接続に使用するツールによっては、バッチセパレータを変更できる場合があります。たとえば、SSMSでは、次の場所に移動してこのオプションを見つけることができます:ツール>オプション>クエリの実行> SQL Server 「バッチを区切るために使用できる単語または文字を指定してください」などのオプションを探します。


    1. selectステートメントのサブクエリはOracleでどのように機能しますか

    2. MySQL、MariaDB、Percona Server、MongoDB、またはPostgreSQLのデプロイ-ClusterControlで簡単に

    3. PostgreSQLでデータベースのスキーマをエクスポートするにはどうすればよいですか?

    4. to_date()がPostgreSQLでどのように機能するか