2017-06-16 10 views
0

この問題は、ストアドプロシージャ内のテーブル変数に含まれていない列名を参照しています。私は、これはエラーが発生しているはずだと仮定しますが、列名がメインクエリで見つかったので代わりに値を返します。無効な列名を使用したテーブル変数での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)。

+0

これは、その意味では前のことですが、これは期待されています...列を正しく指定すると(例: '@DataTable DT from DT.My_id'など)、論理的に期待される結果が得られます。 – HoneyBadger

+1

これは全く予想されています。あなたが思うように、MyIdではなく、@ DataTableからのMy_Idをサブクエリが実際に使用しているというエラーであると思われるクエリでは、これは、この問題を回避するために、テーブル(または別名、好ましくはエイリアス)を含むすべての単一の列を参照することが非常に重要な理由の古典的な例です。 –

答えて

2

サブテーブル内のカラムは、外側テーブル@DataTableから参照されます。相関サブクエリと呼ばれます。外部テーブルの列は、サブクエリ内で参照できます。

これで意味があります。 existsが使用される場合

SELECT MyOtherField FROM @DataTable T 
WHERE T.My_Id IN (SELECT T.My_Id FROM @LookupTable) 

ほとんど相関サブクエリを使用します。あなたはWhere句で外部テーブルから列が

+0

もちろん、それは完璧な意味を持っています...しかし、より大きな作品を見ると、私の中をループしています。今朝から目隠しを取らなければならなかった... –

+0

@DarianMiller - 完全に有効な質問。多くの人が似たような質問をしているのを見ました –

1

を呼ぶ報告「問題」の[1]詳細を見ることができます:現在の質問は問い合わせ

SELECT MyOtherField FROM @TableA 
WHERE ColumnFromTableA IN (SELECT ColumnFromTableA FROM @TableB) 

リターンを以下の予想外の結果と考えています。

[2]これはバグではありません。

[3]これは正常な動作です:それは、DBMS(元のSQL Server。)この列は@TableA内に存在する場合、それは(警告/例外なし)成功して実行されます@TableBのローカルスコープ内ColumnFromTableAを見つけることができません。

関連する問題