Das Problem verweist auf einen Spaltennamen, der nicht innerhalb der Tabellenvariablen innerhalb einer gespeicherten Prozedur liegt. Ich würde annehmen, dass dies zu einem Fehler geführt haben sollte, aber es gibt stattdessen Werte zurück, da der Spaltenname in der Hauptabfrage gefunden wird.TSQL-Problem mit Tabellenvariable mit ungültigen Spaltennamen
Ist das ein bekanntes Problem, vielleicht in SQL Fest 2016? Oder wird dieses Verhalten erwartet?
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).
Ich habe dieses Verhalten vorher gesehen, in diesem Sinne wird es erwartet ... Wenn Sie die Spalten richtig identifizieren (zB: 'von @DataTable DT wo DT.My_id' usw.), erhalten Sie das logisch erwartete Ergebnis. – HoneyBadger
Dies wird vollständig erwartet. In der Abfrage, die Sie für einen Fehler halten sollten, verwendet die Unterabfrage tatsächlich My_Id von @DataTable, nicht MyId, wie Sie denken. Dies ist ein klassisches Beispiel dafür, warum es so wichtig ist, jede einzelne Spalte mit der Tabelle (oder vorzugsweise dem Alias) zu referenzieren, um dieses Problem zu vermeiden. –