我如何(两者)创建一行并在同一“存储过程”中访问该行?

时间:2010-04-22 10:48:38

标签: sql-server-2008

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

感谢您的帮助

5 个答案:

答案 0 :(得分:5)

您可以使用SCOPE_IDENTITY()

SELECT @ColumnID = SCOPE_IDENTITY()

答案 1 :(得分:1)

使用SCOPE_IDENTITY() function

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)