1

在对具有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_IDENTITYor@@IDENTITY系统函数来实现这一点,但不幸的是,这不起作用,因为在执行事务时它为 NULL。

无法将值 NULL 插入列“SecondaryId”、表“@TestTable”;列不允许空值。插入失败。

我知道我可以在这个例子中使用计算列,但我很好奇我正在尝试做的事情是否可能。

4

3 回答 3

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...你就可以用该值更新记录的其他字段。

于 2019-03-21T17:01:32.353 回答
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
于 2019-03-21T16:29:39.190 回答
0

你能改变你的方法并使用 aSEQUENCE而不是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;
于 2019-03-21T15:48:29.840 回答