我试图在具有INSTEAD OF触发器的视图上使用MERGE并输出插入的标识值,但是我得到了错误"列引用" inserted.Whatever& #34;是不允许的,因为它引用了在此语句中未被修改的基表。在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。
这可能吗?