Sql server 使用无效列名的表变量出现TSQL问题
问题是引用的列名不在存储过程的表变量中。我假设这会产生错误,但它会返回值,因为在主查询中找到了列名 这是一个已知的问题,可能在SQL 2016中修复了吗?或者这种行为是预期的Sql server 使用无效列名的表变量出现TSQL问题,sql-server,sql-server-2014,Sql Server,Sql Server 2014,问题是引用的列名不在存储过程的表变量中。我假设这会产生错误,但它会返回值,因为在主查询中找到了列名 这是一个已知的问题,可能在SQL 2016中修复了吗?或者这种行为是预期的 DECLARE @LookupTable TABLE(MyId Integer, PRIMARY KEY(MyId)); INSERT INTO @LookupTable (MyId) Values (1); DECLARE @DataTable TABLE(My_Id Integer, MyOtherField Ch
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) 子查询中的M_Id列引用自外部表
@DataTable
。它被称为相关子查询。外部表中的列可以在子查询中引用
现在它将变得更有意义
SELECT MyOtherField FROM @DataTable T
WHERE T.My_Id IN (SELECT T.My_Id FROM @LookupTable)
当使用
时,通常使用相关子查询。您可以在Where
子句中看到,外部表中的列将被引用M_Id
子查询中的列将被引用自外部表@DataTable
。它被称为相关子查询。外部表中的列可以在子查询中引用
现在它将变得更有意义
SELECT MyOtherField FROM @DataTable T
WHERE T.My_Id IN (SELECT T.My_Id FROM @LookupTable)
当使用时,通常使用相关子查询。您可以在Where
子句中看到外部表中的列将被引用我以前见过这种行为,从这个意义上说,这是预期的。。。如果正确识别列(即:from@DataTable DT where DT.My_id
etc),您将得到逻辑上预期的结果。这完全是意料之中的。在您认为应该是错误的查询中,子查询实际上使用的是@DataTable中的My_Id,而不是您认为的MyId。这是一个典型的例子,说明了为什么使用表(最好是别名)引用每一列以避免此问题是如此重要。我以前见过这种行为,从这个意义上说,这是预期的。。。如果正确识别列(即:from@DataTable DT where DT.My_id
etc),您将得到逻辑上预期的结果。这完全是意料之中的。在您认为应该是错误的查询中,子查询实际上使用的是@DataTable中的My_Id,而不是您认为的MyId。这是一个经典的例子,说明了为什么用表(最好是别名)引用每一列来避免这个问题是如此重要。。。但是,当看到一个更大的一块它通过我的循环。“今天早上必须把眼罩摘下来……”DarianMiller——这是一个完全正确的问题。我已经看到很多人提出了类似的问题,当然这很有道理。。。但是,当看到一个更大的一块它通过我的循环。“今天早上必须把眼罩摘下来……”DarianMiller——这是一个完全正确的问题。我看到很多人提出了类似的问题