2

这是我的表格(Entier = Integer // Caractère long variable = Varchar):

http://i.stack.imgur.com/lNjyy.jpg

在此处输入图像描述

我创建了一个视图 V_Enterprise(idContact, phoneNumber, email, name, city, adress)

我试图在该视图上创建一个触发器以允许用户更新视图:

CREATE TRIGGER test
ON V_Entreprise
INSTEAD OF INSERT
AS 
DECLARE @T_ContactId INT
BEGIN
    INSERT INTO T_Contact 
    SELECT i.phoneNumber, i.email
    FROM Inserted i 

    SELECT @T_ContactId = @@IDENTITY

    INSERT INTO T_Entreprise
    SELECT @T_ContactId, i.name, i.city, i.adress
    FROM Inserted i 
END ;

正如我所料,它适用于简单的插入,但是当我一次添加几行时,它会失败,因为 @T_ContactId 只包含第一个 id。有人可以帮我解决吗?我觉得我应该使用 INNER JOIN 插入,但我不知道如何处理它。

4

4 回答 4

2

好的,您永远不应该将标量变量设置为触发器中插入或删除的值。

请改用 OUTPUT 子句来获取您的 id 值。

于 2013-03-01T15:41:32.113 回答
1

此触发器使用游标上的循环,并且不需要表中有任何特定的唯一性;

CREATE TRIGGER test
ON V_Enterprise
INSTEAD OF INSERT
AS 
BEGIN
   DECLARE @name    VARCHAR(32)
   DECLARE @city    VARCHAR(32)
   DECLARE @address VARCHAR(32)
   DECLARE @pn      VARCHAR(32)
   DECLARE @email   VARCHAR(32)

   DECLARE cursor1 CURSOR FOR
      SELECT name,city,address,phoneNumber,email FROM inserted;

    OPEN cursor1;
    FETCH NEXT FROM cursor1 INTO @name, @city, @address, @pn, @email;
    WHILE @@FETCH_STATUS = 0
    BEGIN
      INSERT INTO T_Contact (phoneNumber,email) VALUES (@pn, @email);
      INSERT INTO T_Enterprise (idcontact,name,city,address) VALUES
         (@@IDENTITY,@name,@city,@address);
      FETCH NEXT FROM cursor1 INTO @name, @city, @address, @pn, @email;
    END
    CLOSE cursor1;
    DEALLOCATE cursor1;
END
GO
于 2013-03-01T16:56:28.783 回答
1

我不知道这是否是一种方法,但您可以在不依赖唯一列或使用游标的情况下使用 OUTPUT 子句进行 INSERT。这种方法确实利用了内存中的临时表,该表可能会因大量插入而变大。

DECLARE @Table table( NewID BIGINT);


INSERT INTO T_Contact (PhoneNumber) 
    OUTPUT Inserted.ID
    INTO @Table
SELECT PhoneNumber FROM inserted WHERE 
;

INSERT INTO T_Enterprise (Contact_ID)
SELECT NewID FROM @Table;
于 2014-04-02T18:11:14.663 回答
0

如果phoneNumberemail是唯一键,T_Contact那么您可以这样做:

CREATE TRIGGER test
ON V_Entreprise
INSTEAD OF INSERT
AS 
DECLARE @T_ContactId INT
BEGIN
    INSERT INTO T_Contact 
    SELECT i.phoneNumber, i.email
    FROM Inserted i 

    SELECT @T_ContactId = @@IDENTITY

    INSERT INTO T_Entreprise
    SELECT
        (SELECT idContact FROM T_Contact
            WHERE phoneNumber = i.phoneNumber AND email = i.email),
        i.name, i.city, i.adress
    FROM Inserted i 
END ;
于 2013-03-01T15:42:46.283 回答