当前位置: 首页 > 知识库问答 >
问题:

在sql ser中通过OPEN XML插入数据时触发器不工作

邵浩大
2023-03-14

我已经为资产确认创建了一个触发器。每当在该表中插入一条新记录时,由于该触发器,同一条记录就会被插入到asset_verification_history表中。

触发器如下

Create trigger [dbo].[tr_insert_after_asset_verification] on [dbo].[asset_verification]
for insert
As
Begin
        declare @verification_id int
        declare @id int
        declare @audit_id int
        declare @date date
        declare @status varchar(15)
        declare @remarks varchar(200)
        declare @creationDate datetime
        declare @modificationDate datetime
        declare @updatedBy int
        declare @audit_action varchar(20)

        Select @verification_id = i.verification_id from inserted i

        If @verification_id IS NOT NULL
        Begin
        Select @id = i.id from inserted i
        Select @audit_id = i.audit_id from inserted i
        Select @date = i.date from inserted i
        Select @status = i.status from inserted i
        Select @remarks = i.remarks from inserted i
        Select @creationDate = i.creationDate from inserted i
        Select @modificationDate = i.modificationDate from inserted i
        Select @updatedBy = i.updatedBy from inserted i

        set @audit_action = 'Insert Record'

        INSERT INTO [dbo].[asset_verification_history]
           ([verification_id]
           ,[id]
           ,[audit_id]
           ,[date]
           ,[status]
           ,[remarks]
           ,[creationDate]
           ,[modificationDate]
           ,[updatedBy]
           ,[audit_action])
     VALUES
           (@verification_id
           ,@id
           ,@audit_id
           ,@date
           ,@status
           ,@remarks
           ,@creationDate
           ,@modificationDate
           ,@updatedBy
           ,@audit_action)

           End
End

当我使用使用OPEN XML的过程将数据插入asset_verification表时,这个触发器只对第一条记录有效。对于其余的记录,触发器不起作用

程序如下

Create procedure [dbo].[usp_AddVerificationBulkData]
(
@vXML XML
)
As
Begin
DECLARE @DocHandle INT

    SET NOCOUNT ON

    EXEC sp_xml_preparedocument @DocHandle OUTPUT, @vXML

     Update asset_verification
     set 
     audit_id = x.AuditId,
     id = x.SerialId,
     date = x.VerificationDate,
     status = x.Status
     ,remarks = x.Remarks
     ,creationDate = x.CreatedOn
     ,modificationDate = x.ModifiedOn
     ,updatedBy = x.ModifiedBy
     From 
     asset_verification a 
     Inner Join 
     OpenXml(@DocHandle,'/ArrayOfAssetVerificationModel/AssetVerificationModel',2)
     With(SerialId int, AuditId int, VerificationDate datetime, Status int, Remarks varchar(200), CreatedOn datetime, ModifiedOn datetime, ModifiedBy int) x
     On a.audit_id = x.AuditId where a.id = x.SerialId;


     INSERT INTO [dbo].[asset_verification]
           ([id]
           ,[audit_id]
           ,[date]
           ,[status]
           ,[remarks]
           ,[creationDate]
           ,[modificationDate]
           ,[updatedBy])
           select SerialId,AuditId,VerificationDate,Status,Remarks,CreatedOn,ModifiedOn,ModifiedBy from OpenXml(@DocHandle,'/ArrayOfAssetVerificationModel/AssetVerificationModel',2)
     With(SerialId int, AuditId int, VerificationDate datetime, Status int, Remarks varchar(200), CreatedOn datetime, ModifiedOn datetime, ModifiedBy int) x
     where SerialId NOT IN (select a.id from asset_verification a where a.audit_id = x.AuditId);
End

问题:-如何使这个触发器适用于通过Open XML插入的每个记录?

共有1个答案

于正志
2023-03-14

你犯了一个典型的错误,认为每行触发一次火。它们不会,每个操作一次,因此插入的伪表包含受该操作影响的所有行。触发器需要以基于集合的方式工作,而不是基于行。试试这个;

CREATE TRIGGER [dbo].[tr_insert_after_asset_verification] ON [dbo].[asset_verification] FOR INSERT AS
BEGIN
    SET NOCOUNT ON

    INSERT  INTO [dbo].[asset_verification_history]
            ( [verification_id]
            ,[id]
            ,[audit_id]
            ,[date]
            ,[status]
            ,[remarks]
            ,[creationDate]
            ,[modificationDate]
            ,[updatedBy]
            ,[audit_action]
            )
            SELECT  i.verification_id
                    ,i.id
                    ,i.audit_id
                    ,i.date
                    ,i.status
                    ,i.remarks
                    ,i.creationDate
                    ,i.modificationDate
                    ,i.updatedBy
                    ,'Insert Record'
            FROM    inserted i
            WHERE   i.verification_id IS NOT NULL

END

顺便说一句,严格来说,您的原始触发器将记录一行,不一定是第一行。

 类似资料:
  • 我写了这个触发器,但它不工作,我执行了这个错误: 11:24:11创建触发器check_venduti在INSERT ON venduti之后,对每一行开始SELECT count(*)作为num_rows FROM prodotto(其中COD_PRODOTTO=New.COD_PRODOTO如果numrows<0,则发出“Error”信号,结束错误代码:1064)。您的SQL语法有错误;检查与

  • 我通过jira触发器插件将jenkins作业设置为触发器<但是jenkins作业没有被触发,尽管它从JIRA那里获得了webhook事件。 我检查了如下内容。 Jenkins得到了网络钩子事件。我在詹金斯日志上检查了这个。 我试着为詹金斯设置各种方式,但都失败了。我想知道如何设置jira触发器 > 测试环境 吉拉:6.4.11 我的测试用例是。。。 Jenkins工作设置 选中:向JIRA添加注释

  • 我们有一个SharePoint2010站点,它有一个自定义功能,可以生成一个word文档,其中包含从所包含的列表项中动态收集的信息。信息正在从SP站点收集,并在包含内容控件的word文档中替换。除了一些字体问题之外,整个word文档生成过程都能正常工作。我们希望在文档中插入一个HTML表,以保持一些富文本格式,这些格式可以由最终用户在SP站点中设置。如果插入的是单元格内容,富文本格式将不会被解释,

  • 我们有一个将文件复制到Azure文件服务器的外部源。文件大小约为10GB。我想在Azure文件服务器上使用Azure Data Factory完成文件复制后,立即将此文件复制到Azure Blob存储。供应商无法将此文件复制到Blob容器。有人能帮我配置什么类型的触发器吗。我可以手动复制,但我正在寻找是否可以实现自动化。我甚至不能安排这个活动,因为来自外部源的文件副本是随机的。 谢谢

  • 我创建了一个触发器,其工作原理如下: 从表中删除数据后它将此行插入位于另一个数据库存档中的表中 我使用dblink在远程数据库中插入数据,问题是创建查询太难了,尤其是表包含20列以上,我想为10个其他表创建类似的函数。 有没有其他快速的方法来确保这项任务? 这里有一个很好的例子:

  • 我正在配置Jira触发器插件(https://github.com/jenkinsci/jira-trigger-plugin)在詹金斯: JIRA触发器配置 我们使用Jira DC版本,并且已经按照@ceilfors共享的文档中所述设置了webhook。詹金斯的工作非常简单: Jenkins构建触发器配置 还配置了一个记录器来分类任何问题: 配置日志记录器 因此,当我在项目SNDBX下添加对任务