将插入的输出值存储._ID 到局部变量以在另一个查询中重用它
Posted
技术标签:
【中文标题】将插入的输出值存储._ID 到局部变量以在另一个查询中重用它【英文标题】:Store the value of output inserted._ID to local variable to reuse it in another query 【发布时间】:2013-11-17 18:12:49 【问题描述】:我想简单地执行一个 SQL 查询,该查询将返回添加到表中的行的当前 ID,例如:
insert into V_Post output inserted._ID values('Please return the id of THIS row :)')
这将返回一个类似 155 的数字
所以我的问题的目的是将该数字存储在某种局部变量中,例如 XVALUE,然后在任何其他 SQL 查询中使用此 XVALUE,例如:
insert into V_Posts values(1, XVALUE, null, GETDATE(), null, null, 1)
所以我想到了类似的东西:
int XVALUE = insert into V_Post output inserted._ID values('Please return the id of THIS row :)')
insert into V_Posts values(1, XVALUE, null, GETDATE(), null, null, 1)
或
insert into V_Posts values(1, insert into V_Post output inserted._ID values('Please return the id of THIS row :)'), null, GETDATE(), null, null, 1)
但两者都不起作用:(
希望我能很好地解释我的问题,并在此先感谢您的帮助。
编辑
请注意我有两个表:V_posts 和 V_post
【问题讨论】:
这有帮助吗:SQL Server - Return value after INSERT 这是一个身份列吗??? 是的,但是请注意我有两个表:V_posts 和 V_post,我正在尝试获取一个表的 ID 并使用另一个表 使用@@IDENTITY 绝不是一个好主意,它会从任何表返回当前会话中生成的最后一个身份值。使用 IDENT_CURRENT('Table_Name') 函数,它将返回您作为参数传递的表名的最后生成值 一旦你在参数中获得了值,在你喜欢插入的任何地方使用它,更新其他表,无论你想用它做什么。 【参考方案1】:身份列
如果它是一个标识列并且您只插入一行,那么您可以使用SCOPE_IDENTITY()
函数来获取当前会话范围内最后生成的标识值。
DECLARE @NewValue INT;
insert into V_Post
values('Please return the id of THIS row :)')
SET @NewValue = SCOPE_IDENTITY()
IF NOT IDENTITY 列或多个标识值
如果它是一个标识列并且您正在插入多行并且想要返回所有新插入的标识值,或者它不是标识列但您需要最后插入的值,那么您可以确保OUTPUT
命令获取新插入的值。
DECLARE @tbl TABLE (Col1 DataType)
DECLARE @NewValue Datatype;
insert into V_Post
output inserted._ID INTO @tbl
values('Please return the id of THIS row :)')
SELECT @NewValue = Col1 FROM @tbl
【讨论】:
非常感谢,这正是我想要的 :) 没问题的朋友,很高兴它有帮助:) @MartinSmith - 我很高兴看到另一个解决方案。 @Yosi @@IDENTITY 返回当前会话中生成的最后一个标识值,这很容易出错,您可以一次在多个表中进行插入,使用 IDENT_CURRENT 消除了这种风险 @MartinSmith欢呼朋友会记住这一点,我从来没有想过。不管怎样,你每天都会学到新东西:)【参考方案2】:你可以使用SCOPE_IDENTITY()
:
insert into V_Posts values(1, SCOPE_IDENTITY(), null, GETDATE(), null, null, 1)
它返回在连接上产生的最后一个 IDENTITY 值,而不管产生该值的表是什么。
你可以找到here一些关于这个值意味着什么的详细信息
【讨论】:
感谢您的回答,但请注意我有两个表:V_posts 和 V_post。我不是想获取同一张表的当前行号。 深入研究答案,它没有谈论行号,并且与一个表的事务无关。【参考方案3】:您不能将inserted.Id的值直接存入变量中,您必须声明表变量,而不是从表变量中存入变量
例如:
-- checking existence of table
IF OBJECT_ID ('Books', 'U') IS NOT NULL
DROP TABLE dbo.Books;
-- creating table
CREATE TABLE dbo.Books
(
BookID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookTitle nvarchar(50) NOT NULL,
ModifiedDate datetime NOT NULL
);
-- declaring variable
DECLARE @bookId INT;
INSERT INTO Books
OUTPUT SET @bookId= INSERTED.BookID
VALUES( 'One Hundred Years of Solitude', GETDATE());
上面的插入查询会报错,因为你不能将值直接存储到变量中。
--Declaring table variable
DECLARE @InsertOutput TABLE
(
BookID INT
)
INSERT INTO Books
OUTPUT INSERTED.BookID
INTO @InsertOutput
VALUES( 'One Hundred Years of Solitude', GETDATE());
SELECT @bookId = BookID FROM @InsertOutput;
SELECT @bookId bookId
现在在@bookId 变量上方,您可以在任何您想使用的地方使用。
如果你不想使用插入,那么你可以使用 Scope_identity(),并且可以将值直接存储到变量中,但有时使用 scope_identity() 可能会出现性能问题。
请,
【讨论】:
请问,@InsertOuput 上的 Column name 应该和 INSERTED 中的 Column name 一样吗?如果我想使用多个INSERTED,就用同名的列吧? @Rian - 不,只有数据类型应该相同。以上是关于将插入的输出值存储._ID 到局部变量以在另一个查询中重用它的主要内容,如果未能解决你的问题,请参考以下文章