将MERGE用于具有INSTEAD OF触发器和OUTPUT子句的视图

时间:2014-08-12 21:59:00

标签: sql-server sql-merge

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

这可能吗?

0 个答案:

没有答案