問題在於引用不在存儲過程中的表變量內的列名稱。我會假設這應該產生了一個錯誤,但它返回值,而列名稱在主查詢中找到。使用無效列名稱的表變量TSQL問題
這是一個已知問題,可能在SQL 2016中修復?或者是預期這種行爲?
DECLARE @LookupTable TABLE(MyId Integer, PRIMARY KEY(MyId));
INSERT INTO @LookupTable (MyId) Values (1);
DECLARE @DataTable TABLE(My_Id Integer, MyOtherField Char(1), PRIMARY KEY(My_Id));
INSERT INTO @DataTable (My_Id,MyOtherField) Values (1,'A');
INSERT INTO @DataTable (My_Id,MyOtherField) Values (2,'B');
INSERT INTO @DataTable (My_Id,MyOtherField) Values (3,'C');
--SELECT MyId works as expected (one row)
SELECT MyOtherField FROM @DataTable
WHERE My_Id IN (SELECT MyId FROM @LookupTable)
--SELECT My_Id should be an error
--Returns three rows when referencing a column name not in @LookupTable
SELECT MyOtherField FROM @DataTable
WHERE My_Id IN (SELECT My_Id FROM @LookupTable)
--Returns expected error: invalid column name 'My_Id'
SELECT My_Id FROM @LookupTable
SQL Server 2014(SP2)。
我以前見過這種行爲,從這個意義上說它是預期的......如果你正確地識別列(即:從@DataTable DT DT.My_id等),你會得到邏輯預期的結果。 – HoneyBadger
這是完全預期的。在你認爲應該是錯誤的查詢中,子查詢實際上是使用@DataTable中的My_Id,而不是你認爲的MyId。這是一個經典的例子,爲什麼它引用每個列與表(或最好是別名)以避免此問題非常重要。 –