我在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' ...这是从哪里来的? –