我在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
答案 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才能更加清晰。