2010-09-21 17 views
1

J'ai une simple tableen utilisant des valeurs générées à la place des déclencheurs

CREATE TABLE tItem (PK_Item INT ITENTITY(1,1) NOT NULL, ItemID VARCHAR(15) NOT NULL) 

où ItemID est un identifiant généré, généralement un certain nombre, mais peuvent différer par le client et d'autres conditions.

ItemID est le résultat de EXEC @TempID = pGeneralIdentifierRetrieve NULL, NULL, @ItemType

actuellement, je l'insertion de nouveaux documents écrits dans une procédure stockée et il fonctionne très bien.

Je voudrais essayer de réécrire l'insert dans le déclencheur INSTEAD OF. J'ai un seul problème - comment référencer des rangées dans la table INSÉRÉE afin que je puisse les mettre à jour avec le nouvel ItemID. Je comprends que je peux le définir dans AFTER INSERT TRIGGER mais cela nécessiterait que la colonne ItemID soit NULLable.

Merci pour toutes les indications

Répondre

0

A l'intérieur du déclencheur, vous pouvez obtenir ce que vous avez essayé d'insérer

Select * from INSERTED 

Je ne sais pas où vous obtiendrez le @ItemType nécessaire par votre proc pour créer l'ID

create trigger ti_tItem 
on tItem 
instead of insert 
as 
begin try 
    insert into tItem(ItemID) 
    select TempID from [The same code in your procedure] 
    where [something] = @ItemType 
end try 

begin catch 
    rollback transaction 
end catch 
+0

merci, Jeff, cependant, je ne peux pas obtenir le MATR_PROV à l'aide d'une simple déclaration de sélection :-( – Harnod

+0

@Harnod - vous pouvez toujours déclarer la @TempID variable, et le définir sur n'importe quel batch transact-sql ou CLR – JeffO

+0

Jeff, vrai pour une ligne, quand j'ai plusieurs rangées insérées, la valeur ne peut pas être – Harnod

0

Je l'ai finalement craqué. Il n'est pas une bonne solution (pour moi) mais cela fonctionne:

SELECT * INTO #MyInserted FROM INSERTED 
    SELECT @RowCount = COUNT(*) FROM #MyInserted WHERE ItemID IS NULL 

    WHILE @RowCount > 0 
    BEGIN 
     EXEC @TempID = pGeneralIdentifierRetrieve NULL, NULL, @ItemType 
     UPDATE TOP (1) #MyInserted SET ItemID = @TempID WHERE ItemID IS NULL 
     SET @RowCount = 0 
     SELECT @RowCount = COUNT(*) FROM #MyInserted WHERE ItemID IS NULL 
    END 

    INSERT INTO tItem (ItemID) SELECT (ItemID) FROM #MySelected 
Questions connexes