(私はひどい説明については、事前に謝罪、しかし、あなたはあなたの下のクエリを実行する場合、私は何を意味するか見るべきである!)なぜif existsがfalseを返すとしても、SQLはif exists構文の真のセクションで文を評価しますか?
なぜMSSQLでもif exists
戻った場合、if exists
コンストラクトのtrue
セクションでステートメントを評価しません偽、エラーを引き起こす?
たとえば、以下の2つのクエリでは、最初にテーブルが存在するかどうかをチェックし、テーブルに特定の列があるかどうかを確認します。何らかの理由で、テーブルが存在するが列は存在しないため、このクエリを実行すると次のエラーがスローされます。
Msg 207, Level 16, State 1, Line 21
Invalid column name 'colB'.
Msg 207, Level 16, State 1, Line 21
Invalid column name 'colC'.
Msg 207, Level 16, State 1, Line 21
Invalid column name 'colA'.
私はエラーをスローせずに、構造物のfalsepart
上に移動するにはSQLのためだった、ここで期待される動作。 (次のクエリと同じように)
ただし、2番目のスクリプト(同じバーテーブル名)は正常に実行されます。これは、クエリが検索しているテーブルが存在しないためです。
--Scripts to setup the example.
CREATE DATABASE TEST
GO
USE TEST
GO
CREATE TABLE t1 (colD VARCHAR(255)) --Create a table with the correct name, but incorrect column names.
GO
--This query fails, because t1 exists, even though the columns in t1 don't.
IF EXISTS (select * from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1' AND COLUMN_NAME IN ('colA','colB','colC'))
BEGIN
SELECT colA FROM t1 WHERE colB = 0 AND colC = 1
END
ELSE BEGIN
SELECT 'FALSE'
END
GO
--This query executes ok, because t2 does not exist.
IF EXISTS (select * from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't2' AND COLUMN_NAME IN ('colA','colB','colC'))
BEGIN
SELECT colA FROM t2 WHERE colB = 0 AND colC = 1
END
ELSE BEGIN
SELECT 'FALSE'
END
誰も私に説明することができますなぜ最初のクエリのエラーは、2番目のクエリが正常に実行されますか?
はこれまでのところ、私は唯一のMicrosoft SQL Server 2012
バッチをコンパイルするのに失敗しました。コードを実行しているところにさえ達していません。特定のクラスに特定のメソッドが含まれているかどうかを確認するために、リフレクション呼び出しの負荷がある場合は、C#で検討してください。それらのチェックを 'if'で持つことはできませんし、' if'の本体の中でクラスのインスタンス上でそのメソッドを呼び出す*という行を持つことはできません - 同じ理由で*失敗する*コンパイル*。 –
@Damien_The_Unbeliever、私はあなたが意味することを理解していますが、オブジェクトのいくつか*が存在しないためにバッチをコンパイルできない場合、オブジェクトの* none *が存在すると、 – KidCode
テーブルの状況はわずかですが、[遅延名解決](https://technet.microsoft.com/en-us/library/ms190686(v = sql.105).aspx)(1か所文が到達するまでSQLが意図的にコンパイルを延期します) –