我正在尝试在具有 INSTEAD OF 触发器的视图上使用 MERGE,并且还输出插入的标识值,但我收到错误“列引用”已插入。不允许任何内容,因为它引用基表在这个语句中没有被修改。每次我在 OUTPUT 子句中使用插入时似乎都会出错。
一个高度简化的例子:
/* Cleanup
DROP VIEW Test_1;
DROP TABLE Test1;
*/
GO
CREATE TABLE Test1
(
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
ID INT IDENTITY(1, 1)
);
GO
CREATE VIEW Test_1
AS
SELECT FirstName, LastName, ID
FROM Test1;
GO
CREATE TRIGGER tiu_Test_1 ON Test_1
INSTEAD OF INSERT, UPDATE
AS
MERGE INTO Test1 T
USING(SELECT * FROM inserted) S
ON T.ID = S.ID
WHEN MATCHED THEN
UPDATE
SET FirstName = S.FirstName,
LastName = S.LastName
WHEN NOT MATCHED BY TARGET THEN
INSERT(FirstName, LastName)
VALUES(S.FirstName, S.LastName);
GO
-- Test MERGE
DECLARE @test TABLE
(
ID INT
);
MERGE INTO Test_1 T
USING(VALUES(N'Jules', N'Vern'))
AS S(FirstName, LastName)
ON T.FirstName = S.FirstName
AND T.LastName = S.LastName
WHEN NOT MATCHED BY TARGET THEN
INSERT(FirstName, LastName)
VALUES(S.FirstName, S.LastName)
OUTPUT inserted.ID INTO @test;
我知道这个例子实际上并不需要 INSTEAD OF 触发器。如果没有触发器,它可以正常工作,但我的实际用例是从多个表中进行选择和更新。
我使用 MERGE 而不是普通的 INSERT/UPDATE 的原因是我想将标识值与未插入的键匹配。MERGE 让我这样做,但 INSERT 没有。
我正在使用 SQL Server 2012。
这可能吗?