在对具有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失败。
我知道我可以在此示例中使用计算列,但是我很好奇我是否可以尝试。
答案 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 ...,您就可以使用该值更新记录的其他字段。