2016-02-12 80 views
0

我有一个触发条件满足时更新另一个表,但是当它更新它的更新id字段而不是正确的字段需要更新。请看代码并给我一个想法是怎么回事。需要帮助,触发器不能正常工作

在此代码中,cardinfotable.cardID是已更新的。

USE [database] 
GO 
/****** Object: Trigger [dbo].[trgUpdateCard] Script Date: 2/12/2016 11:05:23 AM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 

ALTER TRIGGER [dbo].[trgUpdateCard] on [dbo].[CardHolderTable] After insert 
As 
Declare @Counter bigint; 
Declare @maxRandomValue bigint = 2000, @minRandomValue bigint = 1000; 
begin 
Select Cast(((@maxRandomValue + 1) - @minRandomValue) 
    * Rand() + @minRandomValue As bigint) As '@counter' 
    update cardinfotable 
    Set CardInfoTable.CardNumber = '@Counter' from cardinfotable 
    inner join inserted I on I.CardID = CardInfoTable.CardID   
    where I.Visitor = '1' 
END 
+2

你有你的变量用引号引用,这使得它一个字符串。更大的问题是,你的代码假设只有一行插入。有可能会(在某些时候)会有多行,您的代码将被破坏。您需要创建触发器作为基于集合的逻辑。 –

+0

这次不确定你是否对基于集合的逻辑是正确的@SeanLange。他的代码可以用于多行插入,它只会更新具有相同计数器值的所有匹配项。这可能是也可能不是理想的行为,没办法知道。 –

+0

是的,它会执行,但我假设他将需要CardInfoTable中每个CardNumber的唯一值。我无法想象事实并非如此。 –

回答

0

这不是来填充一个变量的正确方法:

Select Cast(((@maxRandomValue + 1) - @minRandomValue) 
    * Rand() + @minRandomValue As bigint) As '@counter' 

这是正确的做法:

SET @counter = Cast(((@maxRandomValue + 1) - @minRandomValue) 
    * Rand() + @minRandomValue As bigint) 

然后肖恩的关于把变量单引号评论是正确的。如果您想实际使用变量中的值,则需要删除引号。

另外,你需要你的DECLARE语句之前的BEGIN声明移到:

ALTER TRIGGER [dbo].[trgUpdateCard] on [dbo].[CardHolderTable] After insert 
As 
begin 

Declare @Counter bigint; 
Declare @maxRandomValue bigint = 2000, @minRandomValue bigint = 1000; 
... 
+0

它不工作,我得到的结果,因为我没有触发器,这是什么触发后看起来像你的建议 –

+0

是你确定你插入行* Visitor ='1'*和CardInfoTable中的相应行存在吗? –

+0

是的,程序插入时。它与2个表中的cardid是相同的。有两种类型的卡插入,普通员工卡和访客卡,我不能操纵员工卡,但我需要更改访客卡。它将cardid值更改为生成的随机数或不更改数字。 –