使用AFTER UPDATE执行UPDATE会触发SQL Server 2008 R2

时间:2014-10-09 12:40:44

标签: sql sql-server sql-server-2008 triggers sql-update

我在SQL Server 2008 R2中有一个包含1000多条记录的表。有一个SharePoint 2010界面,用户可以在其中实时更新此表的行,并且有一个字段(CLASS)应在更新一列或两列(COUNTRY_REASON或/和VENDOR_REASON)时计算。

我正在考虑在更新时创建一个AFTER UPDATE触发器,虽然我想知道它是否不会进入某种循环?

有没有比使用触发器更好的方法来执行此更新?你有什么意见/建议?

CREATE TRIGGER [dbo].[TRG_NOSSCE_UPDATE_CLASS] 
ON [TO_BDB].[dbo].[to_bdb_nossce_comm_act] 
after UPDATE 
AS 
  BEGIN 
      UPDATE [TO_BDB].[dbo].[to_bdb_nossce_comm_act] 
      SET    class = CASE 
                       WHEN ( country_reason = '' OR country_reason IS NULL ) 
                            AND ( vendor_reason = '' OR vendor_reason IS NULL ) 
                       THEN 'NOT CLASSIFIED' 
                       WHEN country_reason = 'Vendor_Issue' 
                            AND ( vendor_reason = '' OR vendor_reason IS NULL ) 
                       THEN 'SITE ISSUE' 
                       WHEN country_reason = 'Vendor_Issue' 
                             OR country_reason = '' 
                             OR country_reason IS NULL 
                      THEN ( 
                         CASE 
                           WHEN vendor_reason IN ( 'Site Product Quality', 'Site QA Release' ) 
                           THEN 'SITE QUALITY' 
                           WHEN vendor_reason = 'Customer Order Management' 
                           THEN 'CPO SCM' 
                         WHEN vendor_reason LIKE 'Other%' THEN 'OTHER REASON' 
                         ELSE 'SITE SCM' 
                         END 
                       ) 
                       ELSE ( 
                         CASE 
                                WHEN country_reason IN ( 'Local Product Quality', 
                                                         'Local QA Release' 
                                                       ) 
                                THEN 'CPO QUALITY' 
                                WHEN country_reason IN ( 'Customs Clearance', 
                                                         'Transport Damage', 
                                                         'Transport Issue' ) 
                                THEN 'TRANSIT' 
                                WHEN country_reason IN ( 
                                     'Artwork', 'Complaince Checks', 
                                     'Registration', 
                                     'Safety Label Changes' ) 
                                THEN 'CPO LCM' 
                                WHEN country_reason = 'Vendor_Issue' 
                                THEN '' 
                                WHEN country_reason LIKE 'Other%' 
                                THEN 'OTHER REASON' 
                                ELSE 'CPO SCM' 
                          END 
                        ) 
                     END 
      WHERE  class = '' 
              OR class IS NULL 
                 AND Len(comment) > 0 
  END 

go 

1 个答案:

答案 0 :(得分:1)

您使用"INSTEAD OF INSERT,UPDATE"并避免使用单个插入更新

文章:

试试这个!添加我评论的其他列

create  TRIGGER TRG_NOSSCE_UPDATE_CLASS
ON [dbo].[to_bdb_nossce_comm_act]
instead OF UPDATE
AS
  BEGIN
      UPDATE a
      SET    a.class = CASE
                         WHEN ( a.country_reason = ''
                                 OR a.country_reason IS NULL )
                              AND ( a.vendor_reason = ''
                                     OR a.vendor_reason IS NULL ) THEN 'NOT CLASSIFIED'
                         WHEN a.country_reason = 'Vendor_Issue'
                              AND ( a.vendor_reason = ''
                                     OR a.vendor_reason IS NULL ) THEN 'SITE ISSUE'
                         WHEN a.country_reason = 'Vendor_Issue'
                               OR a.country_reason = ''
                               OR a.country_reason IS NULL THEN ( CASE
                                                                  WHEN a.vendor_reason IN ( 'Site Product Quality', 'Site QA Release' ) THEN 'SITE QUALITY'
                                                                  WHEN a.vendor_reason = 'Customer Order Management' THEN 'CPO SCM'
                                                                  WHEN a.vendor_reason LIKE 'Other%' THEN 'OTHER REASON'
                                                                  ELSE 'SITE SCM'
                                                                END )
                         ELSE ( CASE
                                  WHEN a.country_reason IN ( 'Local Product Quality', 'Local QA Release' ) THEN 'CPO QUALITY'
                                  WHEN a.country_reason IN ( 'Customs Clearance', 'Transport Damage', 'Transport Issue' ) THEN 'TRANSIT'
                                  WHEN a.country_reason IN ( 'Artwork', 'Complaince Checks', 'Registration', 'Safety Label Changes' ) THEN 'CPO LCM'
                                  WHEN a.country_reason = 'Vendor_Issue' THEN ''
                                  WHEN a.country_reason LIKE 'Other%' THEN 'OTHER REASON'
                                  ELSE 'CPO SCM'
                                END )
                       END
      --,
      --a.column1=b.column1,
      --a.othercolumns=b.othercolumns
      FROM   [dbo].[to_bdb_nossce_comm_act] a,
             inserted b
      WHERE  a.class = ''
              OR a.class IS NULL
                 AND Len(a.comment) > 0
  END

go 

想象一下你在SP中使用游标并将@ class,@ countryreason和@vendorreason作为游标变量,我们可以这样做

cursor loop....start
SET   @class = CASE
                         WHEN ( @country_reason = ''
                                 OR @country_reason IS NULL )
                              AND ( vendor_reason = ''
                                     OR @vendor_reason IS NULL ) THEN 'NOT CLASSIFIED'
                         WHEN @country_reason = 'Vendor_Issue'
                              AND ( @vendor_reason = ''
                                     OR @vendor_reason IS NULL ) THEN 'SITE ISSUE'
                         WHEN @country_reason = 'Vendor_Issue'
                               OR @country_reason = ''
                               OR @country_reason IS NULL THEN ( CASE
                                                                  WHEN @vendor_reason IN ( 'Site Product Quality', 'Site QA Release' ) THEN 'SITE QUALITY'
                                                                  WHEN @vendor_reason = 'Customer Order Management' THEN 'CPO SCM'
                                                                  WHEN @vendor_reason LIKE 'Other%' THEN 'OTHER REASON'
                                                                  ELSE 'SITE SCM'
                                                                END )
                         ELSE ( CASE
                                  WHEN @country_reason IN ( 'Local Product Quality', 'Local QA Release' ) THEN 'CPO QUALITY'
                                  WHEN @country_reason IN ( 'Customs Clearance', 'Transport Damage', 'Transport Issue' ) THEN 'TRANSIT'
                                  WHEN @country_reason IN ( 'Artwork', 'Complaince Checks', 'Registration', 'Safety Label Changes' ) THEN 'CPO LCM'
                                  WHEN @country_reason = 'Vendor_Issue' THEN ''
                                  WHEN @country_reason LIKE 'Other%' THEN 'OTHER REASON'
                                  ELSE 'CPO SCM'
                                END )
                       END

update table set other columns....,class=@class,.... where...

close cursor loop
只有当你分享一块或一眼时,SP才能更加清晰。