Sql Server:一个看似奇怪的行为BEGIN TRAN - COMMIT

时间:2016-10-31 20:17:25

标签: sql-server sql-server-2012

首先创建两个表:

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'.

但这次有结果:

enter image description here

为什么呢?发生了什么事?

修改

我真的为一个制定得很糟糕的问题道歉。问题不在于临时变量。我已经重新设计了问题以消除任何临时变量表​​。

2 个答案:

答案 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

注意:在这两种情况下,返回的结果都是下一个:

enter image description here