首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >T更新触发器

T更新触发器
EN

Stack Overflow用户
提问于 2018-11-08 17:52:21
回答 2查看 61关注 0票数 0

我试图在Server中创建以下触发器,但是SSMS会抛出一个错误,我不知道它是什么。有什么想法吗?

Msg 156,第15级,状态1,第2行 不正确的语法附近的关键字‘触发器’。

代码:

代码语言:javascript
复制
IF NOT EXISTS(SELECT * FROM sys.triggers 
              WHERE object_id = OBJECT_ID(N'[dbo].[trAfterUpdateInfoDoc]'))
    CREATE TRIGGER [dbo].[trAfterUpdateInfoDoc]
    ON [dbo].[InfoDocs]
    AFTER UPDATE
    AS
    BEGIN
        DECLARE @infodoctemplateid INT;
        DECLARE @infodocid INT;
        DECLARE @requireccount FLOAT(2);
        DECLARE @filledcount FLOAT(2);
        DECLARE @pcnt FLOAT(2);

        DECLARE c CURSOR FOR
             SELECT id 
             FROM InfoDocs ifd 
             WHERE exists (SELECT 1 FROM Inserted AS i WHERE i.id = ifd.id)

        OPEN c

        FETCH NEXT FROM c INTO @infodocid

        WHILE @@Fetch_Status = 0 
        BEGIN
            SELECT @infodoctemplateid = InfoDocTemplateId 
            FROM InfoDocs 
            WHERE id = @infodocid;

            SELECT @requireccount = COUNT(*) 
            FROM InfoDocTemplateFields 
            WHERE InfoDocTemplateId = @infodoctemplateid 
              AND IsRequired = 1;

            IF (@requireccount = 0)
            BEGIN
                set @pcnt = 100;
            END
            ELSE
            BEGIN
                select @filledcount = count(*) from InfoDocFields 
                where InfoDocId = @infodocid 
                and InfoDocTemplateFieldId in (select id from InfoDocTemplateFields where InfoDocTemplateId = @infodoctemplateid and IsRequired = 1)
                and (BooleanValue is not null or (StringValue is not null and StringValue <> '') or IntValue is not null or DateValue is not null)

                set @pcnt = @filledcount / @requireccount * 100.0;
            END
            update InfoDocs set PercentageCompleted = @pcnt Where id = @infodocid;

            Fetch next From c into @infodocid
        End
    Close c
    Deallocate c
END
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-08 18:02:48

创建触发器 (限制部分)必须是批处理中的第一个语句,因此不能在它之前使用IF存在检查。

在Server 2016 SP1中,您可以使用CREATE或ALTER触发器.为了同样的行为。

在Server 2016 SP1之前,有一些建议这里

我还支持Zohar的评论,即将此逻辑放入触发器很可能会导致许多性能问题&可能很难跟踪意外的行为/bug。

票数 3
EN

Stack Overflow用户

发布于 2018-11-08 18:24:22

每当创建像触发器这样的SQL对象时,它都需要是批处理中创建的唯一对象。批处理由关键字GO终止。

尝试重构您的代码以适应这种一般结构,并查看它是否有效:

代码语言:javascript
复制
IF OBJECT_ID(N'[dbo].[trAfterUpdateInfoDoc]') IS NOT NULL
    DROP TRIGGER [dbo].[trAfterUpdateInfoDoc]
GO

CREATE TRIGGER [dbo].[trAfterUpdateInfoDoc]
ON [dbo].[InfoDocs]
AFTER UPDATE
AS
BEGIN
    --PLACE CODE HERE
END
GO
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53213489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档