【问题标题】:SQL Server: Insert row with trigger after InsertSQL Server:在插入后插入带触发器的行
【发布时间】:2016-12-22 17:11:48
【问题描述】:

每当使用触发器插入一行时,我都会尝试在表中插入另一行,但收到​​以下错误消息:

DML 语句的目标表 'EDDSDBO.Redaction' 不能有 如果语句包含 OUTPUT 子句,则任何启用的触发器 没有 INTO 子句。

我们将不胜感激任何为此创建解决方法的帮助。

通过阅读下面的链接,我的代码目前如下

Cannot use UPDATE with OUTPUT clause when a trigger is on the table

SQL Server Helper workaround

代码:

ALTER TRIGGER [EDDSDBO].[AddLabel]
ON [EDDSDBO].[Redaction]
AFTER INSERT
AS
BEGIN
    DECLARE @T TABLE (
        [FileGuid] VARCHAR, [X] INT, [Y] INT, [Width] INT, [Height] INT
    )

    INSERT INTO [Redaction] [FileGuid],[X],[Y],[Width],[Height]
    OUTPUT [inserted].[FileGuid], [inserted].[X], [inserted].[Y],
           [inserted].[Width], [inserted].[Height]
    INTO @T
        SELECT
            [inserted].[FileGuid], [inserted].[X], [inserted].[Y], 70, 35
        FROM 
            inserted

    SELECT * 
    FROM @T
END

在阅读所描述的链接之前,INSERT 代码最初如下:

INSERT INTO [Redaction] 
    [FileGuid],[X],[Y],[Width],[Height]
SELECT TOP 1 
    [FileGuid], [X], [Y], 70, 35
FROM [Redaction] AS r1
ORDER BY [ID] DESC

更新: 原来 kCura 的 Relativity 平台不允许插入触发器,所以这是徒劳的......

【问题讨论】:

    标签: sql sql-server triggers


    【解决方案1】:

    由于您在触发器中,触发器本身已经定义了Inserted 伪表供其使用。

    不能将此与OUTPUT 子句需要的Inserted 别名混合使用。

    因此,您不能在触发器内的语句中使用OUTPUT 子句。

    另外:触发器应该静默完成它们的工作并且不产生任何结果集!

    更新:INSERT(应该是easily found on MSDN...)的正确语法是:

    INSERT INTO [Redaction] ([FileGuid], [X], [Y], [Width], [Height])
        SELECT TOP 1 
            [FileGuid], [X], [Y], 70, 35
        FROM 
            [Redaction] AS r1
        ORDER BY 
            [ID] DESC
    

    您需要在INSERT INTO 行的列列表周围添加括号

    【讨论】:

    • 好的,但是使用OUTPUT之前的代码(我刚刚添加到问题中)也抛出了同样的错误,这是为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多