我正在使用一个INSTEAD OF插入触发器在表上设置递增版本号,并将行复制到第二个历史/审核表中。
这些行能够成功地插入到两个表中。
然而,我遇到了一些问题,无法将第一个表格中的新标识返回给用户。
模式
CREATE TABLE Table1
(
id INT IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(250) NOT NULL UNIQUE,
rowVersion INT NOT NULL
)
CREATE TABLE Table1History
(
id INT NOT NULL,
name VARCHAR(250) NOT NULL,
rowVersion INT NOT NULL
)
CREATE TRIGGER TRG_INS_Table1
ON Table1
INSTEAD OF INSERT
AS
DECLARE @OutputTbl TABLE (id INT, name VARCHAR(250))
BEGIN
--make the insert
INSERT INTO Table1 (name, rowVersion)
OUTPUT INSERTED.id, INSERTED.name INTO @OutputTbl(id, name)
SELECT i.name, 1
FROM INSERTED i
--copy into history table
INSERT INTO Table1History (id, name, rowVersion)
SELECT t.ID, i.name, 1
FROM INSERTED i
JOIN @OutputTbl t on i.name = t.name
END
CREATE TRIGGER TRG_UPD_Table1
ON Table1
INSTEAD OF UPDATE
AS
BEGIN
--make the update
UPDATE Table1
SET name = i.name,
rowVersion = (SELECT d.rowVersion + 1 FROM DELETED d WHERE d.id = i.id)
FROM INSERTED i
WHERE Table1.id = i.id
--copy into history table
INSERT INTO Table1History (id, name, rowVersion)
SELECT i.id ,i.name, (SELECT d.rowVersion + 1 FROM DELETED d WHERE d.id = i.id)
FROM INSERTED i
END
在插入触发器中,使用“name”列进行连接并非理想选择,但需要处理多个插入操作。
例如:INSERT INTO Table1 (name) VALUES('xxx'),('yyy')
尝试的解决方案
在插入时,“SCOPE_IDENTITY”为NULL。
INSERT INTO Table1(name)
VALUES('xxx')
SELECT SCOPE_IDENTITY()
or
INSERT INTO Table1(name)
VALUES('xxx')
RETURN SCOPE_IDENTITY()
我也尝试使用OUTPUT - 它返回0
:
DECLARE @IdentityOutput TABLE (id INT)
INSERT INTO Table1(name)
OUTPUT INSERTED.id INTO @IdentityOutput
VALUES('xxx')
SELECT id FROM @IdentityOutput
这些行已经成功插入并具有ID,但是除非我使用下面的方法(似乎有点破解),否则无法访问它们:
INSERT INTO Table1(name)
VALUES('xxx')
SELECT id from Table1 WHERE name = 'xxx'
如何正确获取新ID?
解决方案
不可能!在对具有INSTEAD OF触发器的表进行INSERT时,无法可靠地返回标识符。以下Sidux的回答是我情况下的一个好的解决方法(将INSTEAD OF触发器替换为AFTER触发器并添加默认列)。
INSERT
语句出现错误:无法将NULL值插入到列'rowVersion'中
。 - Felix Pamittan