2010-04-22 32 views
1

我想在创建对象后立即获取对象的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

你可以在'UPDATE/INSERT/DELETE'命令中使用'INSERTED'和'DELETED'(不是在触发器中),请参阅我的回答以了解如何使用'OUTPUT'子句。 – 2010-04-22 11:31:41

回答

5

您可以使用SCOPE_IDENTITY()

SELECT @ColumnID = SCOPE_IDENTITY() 
+0

+1对于SCOPE_IDENTITY()over @@ IDENTITY – AdaTheDev 2010-04-22 10:51:21

+0

@OrbMan - 很高兴再次拥有你。你能编辑我的上面的示例吗? – Richard77 2010-04-22 10:52:45

+0

@ Richard77:见上面 – RedFilter 2010-04-22 10:54:07

0
SELECT @@IDENTITY; 
0

只是为了澄清了有关触发器的误解。您可以创建触发器“FOR UPDATE”,这将导致它们仅在发生更新时触发,而不是插入。

但是这里的其他人都是对的,请使用SCOPE_IDENTITY()

你会使用SCOPE_IDENTITY()@@IDENTITY的原因是,@@IDENTITY是全球服务器,所以如果你有创造另一个表中的记录与标识字段触发,@@IDENTITY将持有该值。

SCOPE_IDENTITY()确保您从刚刚插入的表中获取ID。

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) 
+0

来检索上述SPROC的值,并且不要忘记您可以有多个OUTPUT子句一个语句,因此您可以将输出发送到一个日志表,局部变量和结果集,这些都来自单个原始命令。 – 2010-04-22 11:39:22

相关问题