Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用无效列名的表变量出现TSQL问题_Sql Server_Sql Server 2014 - Fatal编程技术网

Sql server 使用无效列名的表变量出现TSQL问题

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

问题是引用的列名不在存储过程的表变量中。我假设这会产生错误,但它会返回值,因为在主查询中找到了列名

这是一个已知的问题,可能在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)

子查询中的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——这是一个完全正确的问题。我看到很多人提出了类似的问题