-1

これが私の構成です:

  • データベースの更新に使用する再実行可能なバッチ スクリプトがあります。
  • そのバッチ スクリプト内には、次のようなコードがあります。
    • テーブル 'A' が存在しない場合は、テーブル 'A' を作成し、そこに行を挿入します。
  • そのバッチ スクリプトの後半で、そのテーブルにスキーマ バインドされたインデックス付きビューを作成します。
  • 場合によっては、テーブルが作成された後にスクリプトを再実行すると、SQL Server Management Studio は、「このテーブルが存在しない場合」コードによって保護されている「行の挿入」コードを評価し、次のエラー:

    メッセージ 1934、レベル 16、状態 1、行 15 INSERT は、次の SET オプションの設定が正しくないため失敗しました: 'CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING, ARITHABORT'. 計算列のインデックス付きビューやインデックス、フィルター選択されたインデックス、クエリ通知、XML データ型メソッド、空間インデックス操作で使用する SET オプションが正しいことを確認します。

  • 注: 誰かがこの INSERT ステートメントを単独で試した場合、SSMS がこのエラーを生成する と完全に予想されます。
    • ただし、条件付きブロックによって保護されている場合はそうではありません。

私の質問:

SSMS コンパイラは、実際に実行されるかどうかに関係なく、すべての式を評価しますか?

4

2 に答える 2

0

はい、それはそれらすべてを評価します、これを見てください

declare @i int
select @i =1

if @i = 1
begin
    declare @i2 int
    set @i2 = 5
end
else 
begin
    declare @i2 int
    set @i2 = 5
end

メッセージ 134、レベル 15、状態 1、行 12 変数名 '@i2' は既に宣言されています。変数名は、クエリ バッチまたはストアド プロシージャ内で一意である必要があります。

一時テーブルを使用した別の例は次のとおりです:遅延名前解決とは何ですか? なぜ気にする必要があるのですか?

あなたの唯一の方法は、動的SQL内にラップすることです

于 2010-06-10T15:50:42.027 に答える
-1

言及した設定のほとんどは接続レベルであることに注意してください。つまり、それらを設定/変更した場合、接続を閉じるか明示的に値を変更しない限り、それらは有効のままです。

ご質問に戻ります。あなたが言及したエラーは、実行時エラーのように見えます。つまり、INSERT が実際に実行されています。スクリプトを表示できるとよいでしょう (詳細は省略しますが、バッチは保持します)。

編集:実行しようとするSQLを評価するのはSSMSコンパイラではなく、SQL Serverです。「評価する」とはどういう意味ですか?「実行」ですか?バッチ (サーバーによって実際に実行されているもの) を実行すると、SQL Server は最初に構文解析を行い、構文エラーが見つかった場合はエラーをスローします。この時点では何も実行されていません。構文が問題ない場合、サーバーはバッチの実行を開始します。

繰り返しますが、表示されるエラーは実行時のようです。そのため、条件を注意深く監視し、何が起こるかを追跡してください (または、「時々」に関する詳細を提供してください)。

于 2010-06-10T15:54:48.130 に答える