在插入期间捕获IDENTITY列的值,并用作同一事务中另一列的值

时间:2019-03-21 15:35:17

标签: sql-server scope-identity identity-insert

在对具有IDENTITY列的表执行插入操作时,是否可以在同一事务中将IDENTITY值用作另一列的值?

例如:

DECLARE @TestTable TABLE 
                   (
                        PrimaryId INT NOT NULL IDENTITY(1, 1), 
                        SecondaryId INT NOT NULL
                   );

INSERT INTO @TestTable (SecondaryId)
    SELECT 
        SCOPE_IDENTITY() + 1; -- set SecondaryId = PrimaryId + 1

SELECT * FROM @TestTable;

预期:

| PrimaryId | SecondaryId |
+-----------+-------------+
|     1     |      2      |

我认为我可以使用SCOPE_IDENTITY@@IDENTITY系统功能来实现这一点,但是不幸的是,这不起作用,因为在执行事务时它为NULL。

  

无法将值NULL插入表'@TestTable'的列'SecondaryId'中;列不允许为空。 INSERT失败。

我知道我可以在此示例中使用计算列,但是我很好奇我是否可以尝试。

3 个答案:

答案 0 :(得分:0)

您可以更改方法并使用SEQUENCE而不是IDENTITY列吗?

CREATE SEQUENCE TestSequence
    START WITH 1  
    INCREMENT BY 1 ;  
GO
CREATE TABLE TestTable (PrimaryId INT NOT NULL DEFAULT NEXT VALUE FOR TestSequence, SecondaryId INT NOT NULL);

GO

INSERT INTO TestTable (
    SecondaryId
)
SELECT  NEXT VALUE FOR TestSequence + 1; -- set SecondaryId = PrimaryId + 1;

GO 3

SELECT * FROM TestTable;

GO
DROP TABLE TestTable;
DROP SEQUENCE TestSequence;

答案 1 :(得分:0)

我会带一个触发器,这也适用于多行插入,您将需要删除SecondaryID的not null,不确定是否可以接受。

create trigger trg_TestTable
   on    dbo.TestTable
   after insert 
AS 
BEGIN
    update TestTable
    set    SecondaryId = i.PrimaryId
    from   inserted  i
    join   TestTable a
      on   i.PrimaryId = a.PrimaryId;
END
GO

答案 2 :(得分:0)

您可以做的一件事是使用INSERT COMMAND的OUTPUT INSERTED选项来捕获IDENTITY。 在此示例中,IDENTITY字段为ScheduleID。

CREATE PROCEDURE dbo.spScheduleInsert
            (   @CustomerID int,
                @ItemID int,
                @StartDate Date,
                @TimeIn DateTime,
                @TimeOut DateTime,
                @ReturnIdentityValue int OUTPUT )
AS
BEGIN
            DECLARE @TempScheduleIdentity table ( TempScheduleID int )

            INSERT INTO Schedule ( CustomerID,ItemID,StartDate,TimeIn,TimeOut )
            OUTPUT INSERTED.ScheduleID into @TempScheduleIdentity
            VALUES  (@CustomerID,@ItemID,@StartDate,@TimeIn,@TimeOut)

            SELECT @ReturnIdentityValue = (SELECT TempScheduleID FROM @TempScheduleIdentity)

END

一旦有了@ReturnIdentityValue ...,您就可以使用该值更新记录的其他字段。