2016-02-12 109 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值更改爲生成的隨機數或不更改數字。 –