1

我正在尝试在具有 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。

这可能吗?

4

0 回答 0