如何将插入的输出值分配给sql server中的变量?

RAK*_*KAR 38 sql sql-server sql-server-2008

可能重复:
SQL Server输出Clause到标量变量

DECLARE @id int
INSERT INTO MyTable(name)
OUTPUT @id = Inserted.id
VALUES('XYZ')
Run Code Online (Sandbox Code Playgroud)

我正在尝试上面.这怎么可能?

rs.*_*rs. 74

使用表变量来获取id

DECLARE @id int
DECLARE @table table (id int)
INSERT INTO MyTable(name)
OUTPUT inserted.id into @table
VALUES('XYZ')

SELECT @id = id from @table
Run Code Online (Sandbox Code Playgroud)

  • @RakeshHolkar - INSERT语法允许您插入多个记录,因此OUTPUT语法必须能够处理多个记录.因此,即使您只插入一条记录,OUTPUT也会向您返回一组数据.即使该集合只有一个字段的单行,它也是一个集合,而不是整数. (20认同)
  • @MatBailie:这是有道理的,但它与在'select'子句中返回多行的变量赋值完全有效这一事实相冲突.例如:`declare @id bigint = 0; 从TableWithManyIDs中选择@id = ID; print @id;`@id变量将采用最后一行的ID值,它将被打印.因此,对于单个insert语句,输出子句(基本上用作select语句)应该支持相同的语法,例如`output @id = inserted.ID`,这是有意义的.相反,它在'='周围出现语法错误而失败. (6认同)
  • 谢谢先生,是不是可以直接分配给int变量? (4认同)
  • 不,你不能使用局部变量.如果使用上面的代码,则可以访问数据并将值从表设置为变量 (4认同)
  • 让我们在这里清楚,我们只对分配一个值感兴趣,所以它总是最后插入的值,因为它是唯一插入的值.插入不能做什么选择的理由因为"它返回一个集合"是公牛,因为"select"也返回一个集合,但它允许赋值给变量.output子句基本上使它成为一个select语句.那么为什么输出与select不同,需要昂贵的声明整个表的操作呢?当程序被迅速调用时,这并不好; 那些表变量创建开始加起来. (2认同)