2010-03-20 5 views
4

J'ai un problème pour utiliser une table avec un trigger à la place de insert.L'utilisation de OUTPUT/INTO à la place du déclencheur d'insertion invalide la table 'insérée'

La table que j'ai créée contient une colonne d'identité. J'ai besoin d'utiliser un trigger à la place de insert sur cette table. J'ai également besoin de voir la valeur de l'identité nouvellement insérée à partir de mon déclencheur qui nécessite l'utilisation de OUTPUT/INTO dans le déclencheur. Le problème est alors que les clients qui exécutent INSERT ne peuvent pas voir les valeurs insérées.

Par exemple, je crée une table simple:

CREATE TABLE [MyTable](
[MyID] [int] IDENTITY(1,1) NOT NULL, 
[MyBit] [bit] NOT NULL, 
CONSTRAINT [PK_MyTable_MyID] PRIMARY KEY NONCLUSTERED 
(
[MyID] ASC 
)) 

Ensuite, je crée simple au lieu de déclenchement:

create trigger [trMyTableInsert] on [MyTable] instead of insert 
as 
BEGIN 
DECLARE @InsertedRows table(MyID int, 
           MyBit bit); 

INSERT INTO [MyTable] 
     ([MyBit]) 
    OUTPUT inserted.MyID, 
      inserted.MyBit 
    INTO @InsertedRows 
    SELECT inserted.MyBit 
    FROM inserted; 

-- LOGIC NOT SHOWN HERE THAT USES @InsertedRows 
END; 

Enfin, je tente d'effectuer une insertion et récupérer les valeurs insérées:

DECLARE @tbl TABLE (myID INT) 

insert into MyTable 
(MyBit) 
OUTPUT inserted.MyID 
    INTO @tbl 
VALUES (1) 

SELECT * from @tbl 

Le problème est tout ce que je reçois jamais est zéro. Je peux voir que la rangée a été correctement insérée dans la table. Je sais aussi que si je supprime le OUTPUT/INTO de la gâchette, ce problème disparaît.

Des pensées sur ce que je fais de mal? Ou est-ce que je veux faire des choses impossibles?

Merci.

Répondre

2

Vous n'avez pas spécifié ce que sont vos 'clients', mais s'il s'agit d'une application .Net ou similaire, il vous suffit de supprimer la partie INTO de votre sortie. Vos clients ne peuvent pas voir les résultats car ils ne sont pas renvoyés dans le jeu de résultats.

Votre déclencheur devrait alors ressembler à ceci:

create trigger [trMyTableInsert] on [MyTable] instead of insert 
as 
BEGIN 

INSERT INTO [MyTable] 
     ([MyBit]) 
    OUTPUT inserted.MyID, 
      inserted.MyBit 
    SELECT inserted.MyBit 
    FROM inserted; 

-- LOGIC NOT SHOWN HERE THAT USES @InsertedRows 
END; 

Cela provoque des inserts à se comporter comme une requête de sélection dans la mesure où le client est concerné - vous pouvez itérer sur les résultats pour obtenir la valeur d'identité (ou autre valeurs spéciales comme Timestamp). Voici comment LinqToSql prend en charge les colonnes d'identité à la place des déclencheurs d'insertion.

Questions connexes