2013-08-28 61 views
0

我有這個觸發我做觸發不插入正確的行

alter trigger fuzzylogic on oehdrhst_sql 

for insert 
as 
begin 
declare @ordno char(8) 
declare @rownum int 
declare @id int 

select @ordno = ord_no from inserted 
select @rownum = a.id from banktransactions a where convert(char(8),a.OwnReference) = (select ord_no from inserted) 


select @id = a.id from banktransactions a join inserted i on i.ord_no = a.invoicenumber 
where a.invoicenumber = @ordno 
begin 
    insert into triggertest values(@ordno,@rownum,@id) 
    update banktransactions set matchid = @rownum,SupplierInvoiceNumber = @ordno where id = @id 
end 
end 

當我看到裏面triggertest之後我插入一行我看ordno和ROWNUM,但我不斷收到空上的ID

我跑這個sql語句來測試,看看查詢是否不會返回任何東西,但它確實。

select a.id from banktransactions a join oehdrhst_sql b on a.invoicenumber = b.ord_no 

爲什麼變量不打印?

回答

1

選擇@ordno =從插入

這種邏輯是根本性的缺陷ord_no。如果您插入多行,您希望將哪個值分配給該變量?這將是任意的。觸發器每個語句觸發,而不是每行。

您需要更新觸發器來處理多行插入。如果沒有架構,樣本數據和預期的效果,這是在觸發邏輯野生模糊的猜測,你應該使用,而不是從inserted分配任意行:

ALTER TRIGGER dbo.fuzzylogic -- always use dbo prefix! 
ON dbo.oehdrhst_sql -- always use dbo prefix! 
FOR INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT dbo.triggertest -- always use schema prefix! 
    -- where is your column list? 
    SELECT i.ord_no, b1.id, b2.id 
    FROM inserted AS i 
    INNER JOIN dbo.banktransactions AS b1 -- always use schema prefix! 
    ON i.ord_no = CONVERT(CHAR(8), b1.OwnReference) 
    INNER JOIN dbo.banktransactions AS b2 -- always use schema prefix! 
    ON i.ord_no = b2.invoicenumber; 

    UPDATE b 
    SET matchid = b1.id, SupplierInvoiceNumber = i.ord_no 
    FROM dbo.banktransactions AS b 
    INNER JOIN dbo.banktransactions AS b2 -- always use schema prefix! 
    ON b.id = b2.id 
    INNER JOIN inserted AS i 
    ON i.ord_no = b2.invoicenumber 
    INNER JOIN dbo.banktransactions AS b1 -- always use schema prefix! 
    ON i.ord_no = CONVERT(CHAR(8), a.OwnReference); 
END 
GO 

這可能是完全錯誤的,但同樣很難告訴你沒有更多的洞察你的系統(或爲什麼銀行交易表中的三個不同的行應該相關 - 爲什麼!)。它至少應該給你一個開始。

+0

你會分享如何做到這一點? – user867621