相关疑难解决方法(0)

当触发器在表上时,不能将UPDATE与OUTPUT子句一起使用

我执行UPDATEOUTPUT查询:

UPDATE BatchReports
SET IsProcessed = 1
OUTPUT inserted.BatchFileXml, inserted.ResponseFileXml, deleted.ProcessedDate
WHERE BatchReports.BatchReportGUID = @someGuid
Run Code Online (Sandbox Code Playgroud)

这句话很好,很好; 直到在表上定义了一个触发器.然后我的UPDATE陈述将得到错误334:

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

现在,SQL Server团队博客文章中解释了这个问题:

错误消息是不言自明的

他们还提供解决方案:

该应用程序已更改为使用INTO子句

除了我无法做出整篇博文的正面或反面.

所以让我问一下我的问题:我应该改变什么UPDATE才能使它有效?

也可以看看

sql sql-server sql-server-2008-r2

59
推荐指数
2
解决办法
4万
查看次数

多表复杂实体的乐观并发

我有一个复杂的实体(我们称之为Thing),这是在SQL Server中表示为很多表:一个父表dbo.Thing与多个子表dbo.ThingBodyPart,dbo.ThingThought等等.我们已经使用一个单一的实现乐观并发rowversion上柱dbo.Thing,使用UPDATE OUTPUT INTO的技术.这一直很有效,直到我们添加了一个触发器dbo.Thing.我正在寻找选择不同方法的建议,因为我相信我目前的方法无法修复.

这是我们目前的代码:

CREATE PROCEDURE dbo.UpdateThing
    @id uniqueidentifier,
    -- ...
    -- ... other parameters describing what to update...
    -- ...
    @rowVersion binary(8) OUTPUT
AS
BEGIN TRANSACTION;
BEGIN TRY

    -- ...
    -- ... update lots of Thing's child rows...
    -- ...

    DECLARE @t TABLE (
        [RowVersion] binary(8) NOT NULL
    );

    UPDATE dbo.Thing
    SET ModifiedUtc = sysutcdatetime()
    OUTPUT INSERTED.[RowVersion] INTO @t
    WHERE
        Id …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server triggers stored-procedures optimistic-locking

5
推荐指数
1
解决办法
1100
查看次数