我想在创建对象后获取对象的id列的值。但我不想为此运行另一个查询。我的初学者书( SQL Server 2008 for Dummies )表示有2个表(插入和删除),用于保存已插入,更新的最后一行,或删除。
不幸的是,只有触发器(书中说)可以访问这些表。但是,如果我使用触发器,每当我“插入”行时它们就会消失,即使我不需要它们。
我可以使用存储过程获得相同的效果(无需运行单独的查询吗?)
这就是我要做的事情
CREATE PROCEDURE myProcedure
DECLARE @OrganizationName
@ColumnID OUTPUT
AS
INSERT INTO Organization (OrganizationName)
VALUES (@OrganizationName)
SET @ColumnID = (// Please, I need Help here ...)
感谢您的帮助
答案 0 :(得分:5)
您可以使用SCOPE_IDENTITY()
:
SELECT @ColumnID = SCOPE_IDENTITY()
答案 1 :(得分:1)
SELECT @ColumnID = SCOPE_IDENTITY()
答案 2 :(得分:0)
SELECT @@IDENTITY;
答案 3 :(得分:0)
只是为了澄清对触发器的误解。您可以创建触发器“FOR UPDATE
”,这将导致它们仅在发生更新时触发,而不是插入。
但是其他人都是对的,请使用SCOPE_IDENTITY()
。
使用SCOPE_IDENTITY()
而不是@@IDENTITY
的原因是@@IDENTITY
对于服务器是全局的,因此如果您有触发器在另一个具有IDENTITY字段的表中创建记录,则@@IDENTITY
将保留该值。
SCOPE_IDENTITY()
可确保您从刚刚插入的表中获取ID。
答案 4 :(得分:0)
您可以使用OUTPUT子句,该子句可以访问INSERTED和DELETED(仅在更新/删除时删除):
DECLARE @NewRows table (YourIdentityColumn ....
,any other columns here
)
INSERT INTO Organization
(OrganizationName)
OUTPUT INSERTED.YourIdentityColumn, any other columns here
INTO @NewRows
VALUES (@OrganizationName)
当然,一次插入多行时最好:
INSERT INTO Organization
(OrganizationName)
OUTPUT INSERTED.YourIdentityColumn, any other columns here
INTO @NewRows
SELECT
col1, col2, col3...
FROM ...
您还可以从INSERT返回结果集(它将插入行并将结果集返回给过程调用者):
INSERT INTO Organization
(OrganizationName)
OUTPUT INSERTED.YourIdentityColumn, any other columns here
VALUES (@OrganizationName)