首先创建两个表:
CREATE TABLE xyz (Id INT)
CREATE TABLE abc (Id INT)
请注意以下SQL代码:
DELETE FROM abc
BEGIN TRAN
EXEC('
INSERT INTO xyz VALUES (1),(2)
DECLARE @x INT = (SELECT Id FROM xyz)
')
INSERT INTO abc VALUES (1)
COMMIT
SELECT * FROM abc
运行它会输出以下错误:
Msg 512, Level 16, State 1, Line 3
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
并且没有结果。一切如预期。
现在让我们将xyz)
替换为xyz
,将错误更改为语法错误。这是错误:
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'xyz'.
但这次有结果:
为什么呢?发生了什么事?
修改
我真的为一个制定得很糟糕的问题道歉。问题不在于临时变量。我已经重新设计了问题以消除任何临时变量表。
答案 0 :(得分:1)
https://msdn.microsoft.com/en-us/library/ms175010.aspx
由于表变量的范围有限且不属于持久数据库,因此它们不受事务回滚的影响。
答案 1 :(得分:1)
为什么呢?发生了什么事?
好的...... 在第一个查询中:
DECLARE @x INT = (SELECT id FROM @tmp2)
@tmp TABLE中有2个值,因此您无法将这两个值插入变量中,因此会出现以下错误: -
Msg 512, Level 16, State 1, Line 4
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
在第二个查询中:
DECLARE @x INT = (SELECT id FROM @tmp2
存在语法错误,您应该在最后键入另一个)
,因此您会收到以下错误:
Msg 102, Level 15, State 1, Line 4
Incorrect syntax near '@tmp2'.
尝试下一行检索一行:
DECLARE @x INT = (SELECT top (1) id FROM @tmp2) -- top 1 just for test
注意:在这两种情况下,返回的结果都是下一个: