我在SQL Server中的以下觸發:SQL Server觸發器和批量更新
CREATE TRIGGER Trig_UpdateSearch
ON nt_CadProduct
FOR UPDATE
AS
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN
DECLARE @CodProduct INT
SET @CodProduct = (SELECT prdCod FROM INSERTED)
DECLARE @DescSearch VARCHAR(500)
SET @DescSearch = (SELECT CONVERT(VARCHAR(30),p.prdCod) +' '+ CONVERT(VARCHAR(255),p.prdDesc) +' '+ CONVERT(VARCHAR(255),p.prdCaract) +' '+ CONVERT(VARCHAR(30),p.prdCodFab) +' '+ CONVERT(VARCHAR(255),f.fabname) +' '+ CONVERT(VARCHAR(100),g.grpName) +' '+ CONVERT(VARCHAR(100),a.agrpname) +' '+ CONVERT(VARCHAR(100),t.tpName)
FROM nt_CadProduct AS p
LEFT JOIN nt_cadFab AS f ON p.prdFab = f.fabcod
LEFT JOIN nt_CadGp AS g ON p.prdGp = g.grpCod
LEFT JOIN nt_cadagp AS a ON p.prdagp = a.agpcod
LEFT JOIN nt_CadT AS t ON p.prdTb = t.tpCod
WHERE prdCod = @CodProduct)
UPDATE Index_nt_CadProduct
SET IndexSearch = @DescSearch
WHERE IdProduct = @CodProduct
IF @@ROWCOUNT = 0
INSERT INTO Index_nt_CadProduct (IdProduct, IndexSearch)
VALUES (@CodProduct, @DescSearch)
END
這是工作的罰款單更新,但如果我嘗試批量更新這是行不通的,因爲子查詢返回多於1值,我試圖使用JOIN INSERTED而不是使用DECLARE,但它也不起作用。
我試圖從其他SO回答幾個「解決方案」,但沒有成功,因爲需要我進行@DescSearch
查詢返回CONCAT結果
我已經改變了列名,因此,如果有是任何拼錯只是忽略它。實際觸發功能
一個常見的初學者錯誤。而不是填充變量,您應該使用JOINs插入/刪除,以便您的觸發器處理所有行。我確定這個問題已經在StackOverflow上重複了好幾次。 –
就像我說過的,我已經嘗試使用JOINS插入太多,但得到相同的錯誤。我認爲這個問題在DECLARE DescSearch查詢中的某處,我使用DECLARE CodProduct來連接列。我試過SELECT i.prdCod FROM INSERTED,而不是在嵌套select中使用DECLARE CodProduct – Alephtus
,你有很多左連接,你的where是'WHERE prdCod = @ CodProduct',但你沒有限定'prdCod' ...這是從哪裏來的? –