如何使用触发器将多行插入外键表以及主键表行列表

时间:2018-12-03 05:06:17

标签: sql sql-server xml triggers

我正在尝试插入具有相同数据和不同供应商ID的多行,这些供应商ID应用于XML列表,但不适用于while循环,请给我解决方案。

ALTER TRIGGER [dbo].[trginsert] 
ON [dbo].[Employee_Test]
AFTER INSERT 
AS
    DECLARE @Name VARCHAR(50)
    DECLARE @sal INT

    SET @Name = (SELECT i.Emp_name FROM inserted AS i)
    SET @sal = (SELECT i.Emp_Sal FROM inserted AS i)

    DECLARE @count INT
    SET @count = (SELECT COUNT(id) AS 'number of vendors' 
                  FROM AspNetUsers 
                  WHERE ERPMainCustID IS NOT NULL)

    DECLARE @id INT
    DECLARE @ids XML

    SET @ids = (SELECT id AS [*] 
                FROM AspNetUsers 
                WHERE ERPMainCustID IS NOT NULL
                FOR XML PATH('ID'), ROOT('IDs'), TYPE)

    WHILE @id >= @count
    BEGIN
        INSERT INTO Employee_Test 
        VALUES (@Name, @sal, @id)
    END

1 个答案:

答案 0 :(得分:0)

SQL Server触发器不是每行运行一次,而是每条语句运行一次-因此,如果您的INSERT语句一次插入10行(例如,通过使用SELECT .... FROM ...子句),则可以得到触发器称为一次,但是Inserted将包含 10行。编写触发器时,您需要考虑到这一点!

您需要以基于集合的方式处理Inserted-不要指望它仅包含一行....而且:首先从{{1}中选择那些ID确实没有意义。 }转换为XML变量,然后对它们执行RBAR(逐列行)WHILE循环以插入.....:再次使用正确的基于集合的方法!

最后,您的触发器可能看起来像这样:

AspNetUsers