2013-04-26 2 views
0

Je dois ajouter une colonne supplémentaire à une table existante, puis insérer les valeurs de colonnes appropriées pour les enregistrements existants. Je dois le faire dans une seule procédure stockée.Modifier la valeur de la colonne directement après la création (au sein d'une seule procédure stockée)

Jusqu'à présent, je donne les résultats suivants (studio de gestion SQL signale qu'il ne peut pas trouver la nouvelle colonne afin d'ajouter les valeurs aux enregistrements existants):

BEGIN 
    ALTER TABLE tbl1 
    ADD col_add int 

    UPDATE tbl1 
    SET [col_add]='value' 
    WHERE col_pk = 1 
    END 

J'ai essayé d'ajouter un mot-clé « GO » entre les instructions ALTER et UPDATE, mais il signale ensuite une erreur de syntaxe.

Merci d'avance.

Répondre

2

Je pense que vous devez vous engager votre « alter table », puis faire votre mise à jour, et ne pas oublier de commettre votre mise à jour aussi:

BEGIN 
    BEGIN TRAN 
    ALTER TABLE tbl1 
    ADD col_add date 
COMMIT; 
    BEGIN TRAN 
    UPDATE tbl1 
    SET [col_add]='value' 
    WHERE col_pk = 1 
COMMIT; 
    END 
+0

C'est à mi-chemin, mais vous devez commencer vos transactions avec 'BEGIN TRAN' avant de pouvoir engager – GarethD

+0

Est-ce vraiment nécessaire si vous faites un commit après l'autre? Peut-être que si vous faites 'alter', 'update' et ensuite commit, vous devez ajouter une transaction, mais je ne pense pas que si vous faites 'alter' 'commit' 'update' 'commit', vous avez besoin de transaction. peut-être que je me trompe mais ... –

+0

Oui c'est nécessaire, testez-le. La procédure se compilera sans 'BEGIN TRAN', mais produira une erreur lors de l'exécution. Il y a un script de test [ici] (http://sqlfiddle.com/#!3/0ed4a/1), qui ne fonctionnera pas à cause des permissions sur SQL Fiddle, mais vous pouvez l'essayer sur votre DB. Si vous décommentez les lignes 'BEGIN TRAN', vous verrez la procédure s'exécuter sans erreur (si elle est exécutée une fois). – GarethD

2

L'erreur de nom de la table se produit lors de l'analyse. Dans SSMS, go fonctionne car il sépare les lots. Mais une procédure stockée est toujours un seul lot.

Vous pouvez utiliser exec ou sp_executesql pour forcer un nouveau cycle de l'analyse syntaxique dans une procédure stockée:

exec ('UPDATE tbl1 SET [col_add]='value' WHERE col_pk = 1') 
Questions connexes