この問題は、ストアドプロシージャ内のテーブル変数に含まれていない列名を参照しています。私は、これはエラーが発生しているはずだと仮定しますが、列名がメインクエリで見つかったので代わりに値を返します。無効な列名を使用したテーブル変数での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 from DT.My_id'など)、論理的に期待される結果が得られます。 – HoneyBadger
これは全く予想されています。あなたが思うように、MyIdではなく、@ DataTableからのMy_Idをサブクエリが実際に使用しているというエラーであると思われるクエリでは、これは、この問題を回避するために、テーブル(または別名、好ましくはエイリアス)を含むすべての単一の列を参照することが非常に重要な理由の古典的な例です。 –