Sql server 2008 在SQL Server中触发相同表的更新/插入触发器
我有一张Articlemaster桌子。 我想更新ArticleMaster的Aging列,以便根据需要在ArticleMaster中插入/更新 NSI_激活表中的“月n年”列的值 skuSize表中状态的值 条件:- 如果状态为“R”,则老化为“重复” 其他的 如果是第4个月,则老化=卡斯特年,如varchar4+'1-3' 1.是否需要为我的案例创建触发器,或者是否存在任何其他可能性 我写了一个触发器,但它只更新了一条记录,而不是多次更新。所以我尝试用临时表创建,如下所示,但它将进入无限循环Sql server 2008 在SQL Server中触发相同表的更新/插入触发器,sql-server-2008,tsql,Sql Server 2008,Tsql,我有一张Articlemaster桌子。 我想更新ArticleMaster的Aging列,以便根据需要在ArticleMaster中插入/更新 NSI_激活表中的“月n年”列的值 skuSize表中状态的值 条件:- 如果状态为“R”,则老化为“重复” 其他的 如果是第4个月,则老化=卡斯特年,如varchar4+'1-3' 1.是否需要为我的案例创建触发器,或者是否存在任何其他可能性 我写了一个触发器,但它只更新了一条记录,而不是多次更新。所以我尝试用临时表创建,如下所示,但它将进入无限循环
ALTER TRIGGER AgingUpdation
ON Articlemaster
AFTER INSERT,UPDATE
AS
BEGIN
IF ((
SELECT TRIGGER_NESTLEVEL()) > 1 )
RETURN
SET NOCOUNT ON;
DECLARE @i INT, @d INT,@c INT,@month INT;
DECLARE @MonthTable TABLE(idx bigint Primary key identity(1,1),ArticleCode varchar(30),CompCode varchar(20),MonthNo INT,DateToMarketYear INT,[Status] char(1))
SELECT @i = COUNT(*) FROM inserted;
SELECT @d = COUNT(*) FROM deleted;
insert into @monthtable(ArticleCode,CompCode,MonthNo,DateToMarketYear,[Status])
Select I.ArticleCode,I.CompCode,N.DatetoMarketMonth,N.DateToMarketYear,(select top 1 Status from SkuSize S INNER JOIN Inserted I on S.ArticleCode=I.ArticleCode and S.CompCode=I.CompCode)
from NSI_Activation N inner join Inserted I on N.ArticleCode=I.ArticleCode and I.Compcode=N.CompCode
IF @i + @d > 0
BEGIN
IF @i > 0 AND @d = 0 -- Insert
BEGIN
Set @c=1
While(@c<=(SELECT MAX(idx) from @MonthTable))
BEGIN
if (Select [Status] from @MonthTable where idx=@c)='R'
update A set A.Aging='Repeat' from ArticleMaster A
inner join @MonthTable T on A.ArticleCode=T.ArticleCode
else If (Select MonthNo from @MonthTable where idx=@c)<4
update A set A.Aging=CAST(T.DateToMarketYear as varchar(4))+'_1-3' from ArticleMaster A inner join @MonthTable T on A.ArticleCode=T.ArticleCode and A.Compcode=T.CompCode
else
update A set A.Aging=CAST(T.DateToMarketYear as varchar(4))+'_4-12' from ArticleMaster A inner join @MonthTable T on A.ArticleCode=T.ArticleCode and A.Compcode=T.CompCode
END
set @c=@c+1
END
IF @i > 0 AND @d > 0 --Update
BEGIN
Set @c=1
While(@c<=(SELECT MAX(idx) from @MonthTable))
BEGIN
if (Select [Status] from @MonthTable where idx=@c)='R'
update A set A.Aging='Repeat' from ArticleMaster A
inner join @MonthTable T on A.ArticleCode=T.ArticleCode
else If (Select MonthNo from @MonthTable where idx=@c)<4
update A set A.Aging=CAST(T.DateToMarketYear as varchar(4))+'_1-3' from ArticleMaster A inner join @MonthTable T on A.ArticleCode=T.ArticleCode and A.Compcode=T.CompCode
else
update A set A.Aging=CAST(T.DateToMarketYear as varchar(4))+'_4-12' from ArticleMaster A inner join @MonthTable T on A.ArticleCode=T.ArticleCode and A.Compcode=T.CompCode
END
set @c=@c+1
END
END
END
我在谷歌上搜索了很多,但没有找到出路。
受够了触发器。还有其他可能的方法吗?如果我理解正确,您可以使用类似的方法
UPDATE A
SET A.Aging=(CASE
WHEN s.Status='R' THEN 'Repeat'
WHEN s.Status!='R' and N.MonthNo <4 THEN CAST(N.DateToMarketYear as varchar(4))+'_1-3'
WHEN s.Status!='R' and N.MonthNo >=4 THEN CAST(N.DateToMarketYear as varchar(4))+'_4-12'
ELSE A.Aging
END)
FROM ArticleMaster A
inner join inserted I ON A.ArticleCode=I.ArticleCode and A.Compcode=I.CompCode
inner join NSI_Activation N ON N.ArticleCode=I.ArticleCode and N.Compcode=I.CompCode
inner join SkuSize S ON S.ArticleCode=I.ArticleCode and S.Compcode=I.CompCode
可能是第二个=的错误吗?我无法更改触发器,因为它需要20分钟以上的时间,并且无法删除/删除,当尝试从设计器模式执行此操作时,它显示错误->超过了锁定请求超时时间。似乎另一个事务正在锁定所需的资源表/视图。。。您可以按照以下url中的说明操作。