我想简单地执行一个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
答案 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()可能会影响性能。
请