2008-12-15 8 views
0

Voici ma procédure stockée. Je veux utiliser la procédure stockée sélectionner toute la ligne de date de tbl_member et insérer la table 2. Mais ce n'est pas le travail. Quelqu'un peut m'aider?Procédure stockée, pouvez-vous m'aider?

Create PROCEDURE sp_test 
AS 
BEGIN 
    SET NOCOUNT ON; 

    Declare @A Varchar(255), @B Varchar(255), @C Varchar(255), @D int 

    Declare Table_Cursor Cursor 
    For select A, B, C from tbl_Member Open Table_Cursor 
     Fetch Next From Table_Cursor 
     Into @A, @B, @C While(@@Fetch_Status=0) 

    Begin Exec(
     'insert into NewMember (A, B, C, D) values (@A, @B, @C, @D) 
     set @D = @@IDENTITY 
     Insert into MemberId (Mid) VALUES(@D) 
    ) 
    Fetch Next From Table_Cursor Into @A, @B, @C End Close Table_Cursor 
    Deallocate Table_Cursor 
END 
GO 
+0

Vous avez un 'avant' insérer "et pas un après. –

+0

Vous devriez certainement apprendre à mettre votre code correctement en retrait. Il est vraiment difficile de voir que vous avez une boucle while ici parce que vous avez caché à la fois le temps et la fin au milieu de la ligne, entre les autres déclarations. –

Répondre

8

La première chose que je peux voir ici est que vous utilisez un curseur lorsque vous n'en avez pas besoin. Vous pouvez réécrire la première requête comme:

INSERT INTO NewMember(A, B, C, D) 
SELECT A, B, C, D 
FROM tbl_member 

Ensuite, j'aurais un déclencheur INSERT sur NouveauMembre qui a inséré la colonne d'identité.

create trigger myInsertTrigger 
on newmember 
for insert 
as 
insert into memberid(mid) 
select <<identity_column>> from inserted 

BTW - c'est une mauvaise idée d'utiliser @@ IDENTITY pour obtenir l'identité d'un insert. Utilisez plutôt la fonction SCOPE_IDENTITY.

3

Veuillez prêter une attention particulière à ce que Pete a dit à propos de @@ identity. La raison pour laquelle il est mauvais d'utiliser @@ identity est que si un déclencheur est ajouté à la table qui est insérée dans une autre table avec une identité, c'est l'identité renvoyée qui n'est pas celle que vous venez d'insérer. Cela peut conduire à des problèmes d'intégrité des données massives qui peuvent ne pas être caufght pendant des mois.

Même si vous avez gardé le curseur (ce que je ne recommande pas, les curseurs sont un très mauvais moyen de faire des insertions car ils sont très lents par rapport à la solution basée sur des ensembles), votre code n'a pas pu à la première table si la colonne D est la colonne d'identité (ce que j'imagine que c'est parce que vous essayez plus tard d'assigner D à la valeur d'identité). C'est parce que vous essayez de mettre une valeur dans une colonne qui ne peut pas accepter une valeur car elle est générée automatiquement. Si D est l'identité, ne l'utilisez pas du tout dans l'insertion, définissez simplement les colonnes dans lesquelles vous devez insérer. Ce serait aussi vrai pour la solution de Pete, si D est en fait votre colonne d'identité.

Questions connexes