如何引用新插入的行的PK

时间:2012-08-22 15:00:49

标签: sql tsql stored-procedures

我有一个查询,其中记录被添加到表通道。然后为每个记录分配一个channelID,它是表的PK,并自动递增。将记录添加到通道表后,我想将与该记录关联的字符串插入另一个称为通道关键字的表中。我的问题是我还需要传入上一个查询中创建的channelID作为channelskeywords表的insert语句的参数,但我不太清楚如何做到这一点。

    IF @matchBy ='title'
    BEGIN
    insert into channels
    (userID,matchTitle,matchTitleAbstract, fromMyPage)
    values
    (@userID,1,0,@fromMyPage)


    END 

    IF @matchBy ='TitleAbstract'
    insert into channels
    (userID,matchTitle,matchTitleAbstract, fromMyPage)
    values
    (@userID,0,1,@fromMyPage)
    BEGIN

    IF (NULLIF(@keyword1, '')) IS NOT NULL
    insert into channelsKeywords

2 个答案:

答案 0 :(得分:0)

您可以通过

获取ID
Select Scope_Identity() 

即:

insert into channels 
(userID,matchTitle,matchTitleAbstract, fromMyPage) 
values 
(@userID,1,0,@fromMyPage) 
select @ChannelID = Scope_Identity()

答案 1 :(得分:0)

尝试这样的事情

BEGIN
    -- be sure to declare this same scope as the one whol will be using the value
    DECLARE @CNT INT

    insert into channels (userID,matchTitle,matchTitleAbstract, fromMyPage)
    values (@userID,1,0,@fromMyPage)

    SET @CNT = Scope_Identity()  -- holds the value of the inserted ID

END 

其他信息:

  • @@IDENTITY返回在所有范围内为当前会话中的任何表生成的最后一个标识值。您需要小心,因为它跨越范围。您可以从触发器获取值,而不是当前的语句。

  • SCOPE_IDENTITY返回为当前会话中的任何表和当前范围生成的最后一个标识值。一般来说你想用什么。

  • IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的最后一个标识值。这使您可以指定您想要该值的表,以防上述两个表格不是您需要的(非常罕见)。

<强> See also here