将输出inserted._ID的值存储到局部变量,以在另一个查询中重用它

时间:2013-11-17 18:12:49

标签: sql sql-server sql-server-2008

我想简单地执行一个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)

OR

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

3 个答案:

答案 0 :(得分:9)

IDENTITY COLUMN

如果它是一个标识列,并且您只插入一行,那么您可以使用SCOPE_IDENTITY()函数在当前会话的范围内获取最后生成的标识值。

DECLARE @NewValue INT;
insert into V_Post 
values('Please return the id of THIS row :)')
SET @NewValue = SCOPE_IDENTITY()

如果不是IDENTITY列或多个标识值

如果它是一个标识列,并且您要插入多行并希望返回所有新插入的标识值,或者它不是标识列,但您需要最后插入的值,那么您可以确保{{1} }命令获取新插入的值。

OUTPUT

答案 1 :(得分:1)

您可以使用SCOPE_IDENTITY()

insert into V_Posts values(1, SCOPE_IDENTITY(), null, GETDATE(), null, null, 1) 

它返回连接上生成的最后一个IDENTITY值,而不管生成该值的表。

您可以找到here有关此值意味着什么的详细信息

答案 2 :(得分:0)

您不能将insert.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()可能会影响性能。