SQL server 触发器,在触发Merge过程中,逐行触发的解决办法 用group by 避免是一次触发中的多行更新或删除。
2014-10-29 11:36
459 查看
When I share "tsql trigger row by row" on bing.
I got :点击打开链接
Trigger:
My test case:
1. Inserting 4111 records,it costs zero second.
Insert records into avordertrancking.
Check the statistics, it costs 2+35+37=74ms to insert 4111 records into avordertrancking.
Check the result set, it has inserted.
2. Updating 4111 records,it costs zero ms
Update all records in avordertrancking. it costs 7+18+11=36ms
Check the result set ,it has updated
3. Additional It raise error without grouping
Here is example contains:
01create apoms database.sql
02dbo.AVCUSTTABLE_WEBE_LOG.Table.sql
03dbo.avORDERTRACKING_bak.Table.sql
04dbo.avordertracking.Table.sql
05BMSSA.UPD_ORDERTRACKING_WEBE.sql
06[APOMS].[dbo].[avORDERTRACKING_bak] 2014-10-29 11-23-36.sql
07test.sql
runall.bat
download:
点击打开链接
I got :点击打开链接
Trigger:
IF OBJECT_ID('dbo.UPD_ORDERTRACKING_WEBE','TR') IS NOT NULL BEGIN DROP TRIGGER dbo.UPD_ORDERTRACKING_WEBE END GO CREATE TRIGGER dbo.UPD_ORDERTRACKING_WEBE ON dbo.avORDERTRACKING AFTER INSERT,UPDATE AS BEGIN /*SET NOCOUNT ON added to prevent extra result sets from *interfering with SELECT statements.*/ SET NOCOUNT ON; --organize source data ;WITH s AS ( SELECT INSERTED.dataareaid AS dataareaid,INSERTED.CustAccount AS accountnum, GETDATE() AS refresh_ts,MAX(INSERTED.recid) recid,MAX(INSERTED.RECVERSION) RECVERSION,MAX(INSERTED.PARTITION) PARTITION FROM INSERTED WHERE INSERTED.avorderstatus <> 'DELETED' GROUP BY INSERTED.dataareaid,INSERTED.CustAccount --for records of this set maybe not unique,using 'group by' can prevent updating or deleting the same row twice. ) --begin merge AVCUSTTABLE_WEBE_LOG MERGE INTO AVCUSTTABLE_WEBE_LOG d USING s ON d.dataareaid = s.dataareaid AND d.accountnum = s.accountnum WHEN matched THEN UPDATE SET d.refresh_ts = s.refresh_ts WHEN NOT matched THEN INSERT ( DATAAREAID,ACCOUNTNUM,REFRESH_TS,RECID,PARTITION,RECVERSION)VALUES ( s.DATAAREAID,s.ACCOUNTNUM,s.REFRESH_TS,s.recid,S.PARTITION,s.RECVERSION) ;--end merge END GO
My test case:
1. Inserting 4111 records,it costs zero second.
Insert records into avordertrancking.
Check the statistics, it costs 2+35+37=74ms to insert 4111 records into avordertrancking.
Check the result set, it has inserted.
2. Updating 4111 records,it costs zero ms
Update all records in avordertrancking. it costs 7+18+11=36ms
Check the result set ,it has updated
3. Additional It raise error without grouping
IF OBJECT_ID('dbo.UPD_ORDERTRACKING_WEBE','TR') IS NOT NULL BEGIN DROP TRIGGER dbo.UPD_ORDERTRACKING_WEBE END GO CREATE TRIGGER dbo.UPD_ORDERTRACKING_WEBE ON dbo.avORDERTRACKING AFTER INSERT,UPDATE AS BEGIN /*SET NOCOUNT ON added to prevent extra result sets from *interfering with SELECT statements.*/ SET NOCOUNT ON; --organize source data ;WITH s AS ( SELECT INSERTED.dataareaid AS dataareaid,INSERTED.CustAccount AS accountnum, GETDATE() AS refresh_ts, INSERTED.recid , INSERTED.RECVERSION RECVERSION, INSERTED.PARTITION FROM INSERTED WHERE INSERTED.avorderstatus <> 'DELETED' --for records of this set maybe not unique,using 'group by' can prevent updating or deleting the same row twice. ) --begin merge AVCUSTTABLE_WEBE_LOG MERGE INTO AVCUSTTABLE_WEBE_LOG d USING s ON d.dataareaid = s.dataareaid AND d.accountnum = s.accountnum WHEN matched THEN UPDATE SET d.refresh_ts = s.refresh_ts WHEN NOT matched THEN INSERT ( DATAAREAID,ACCOUNTNUM,REFRESH_TS,RECID,PARTITION,RECVERSION)VALUES ( s.DATAAREAID,s.ACCOUNTNUM,s.REFRESH_TS,s.recid,S.PARTITION,s.RECVERSION) ;--end merge END GO
Here is example contains:
01create apoms database.sql
02dbo.AVCUSTTABLE_WEBE_LOG.Table.sql
03dbo.avORDERTRACKING_bak.Table.sql
04dbo.avordertracking.Table.sql
05BMSSA.UPD_ORDERTRACKING_WEBE.sql
06[APOMS].[dbo].[avORDERTRACKING_bak] 2014-10-29 11-23-36.sql
07test.sql
runall.bat
download:
点击打开链接
相关文章推荐
- SQL Server“错误14274: 无法添加、更新或删除从MSX服务器上发起的作业”的解决办法
- SQL Server“错误14274: 无法添加、更新或删除从MSX服务器上发起的作业”的解决办法
- sql server 存储过程中创建视图 触发器的解决办法
- GridView连接SQL Server 2005实现增加、更新、删除按钮时遇到的两个错误及解决办法
- sql数据库键列信息不足或不正确 更新影响到多行的解决办法
- 如果解决Sql Server 错误(error 14274: 无法添加、更新或删除从msx服务器上发起的作业.)
- 安装sql server 2008,提示要删除SQL Server 2005 Express 工具的解决办法
- sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
- 系统在一次更新后开机出现您可能是软件盗版的受害者解决办法
- sql server 2008 删除数据库出现"因为它正用于复制"的错误解决办法
- SQL Server删除用户时产生“数据库主体在该数据库中拥有架构,无法删除”的解决办法
- [转]Thinkvantage system update删除更新储存文件解决办法
- 关于CListCtrl控件更新Item的闪烁问题和一次插入大容量数据的显示问题解决办法
- SQL SERVER 2005安装过程中 “性能监视器计数器要求错误” 的解决办法
- SQL Server 2008 R2更新Service Pack 1失败的解决办法
- PL/SQL命令窗口里,过程,包,触发器等不能执行的解决办法
- 触发器引起“键列信息不足或不正确。更新影响到多行” 解决办法
- Thinkvantage system update删除更新储存文件解决办法...
- SQL Server 触发器:表的特定字段更新时,触发Update触发器
- SQL Server 触发器 表的特定字段更新时,触发Update触发器