2010-06-09 6 views
5

si j'ai dites procédure stockéeAjouter une colonne et mettre à jour dans la même procédure stockée dans SQL Server 2008

CREATE PROCURE w AS 

ALTER TABLE t ADD x char(1) 

UPDATE t set x =1 

Même quand il me permet de créer cette procédure stockée (si je crée quand x existe), quand il s'exécute, il y a une erreur sur l'instruction UPDATE car la colonne x n'existe pas.

Quelle est la façon conventionnelle de faire face à cela, il faut le relever tout le temps? Je peux contourner cela en mettant la MISE À JOUR dans EXEC, y at-il une autre/meilleure façon?

Merci

+3

Pourquoi diable modifiez-vous le schéma de la table dans s sproc? –

+0

quelle horreur hein? C'est un appel de jugement, peut-être un mauvais. Le tableau que je modifie est celui dans lequel les données brutes sont téléchargées. Et il y aura différentes tables avec différents shemas. Dans tous les cas, ils auront besoin de ces deux colonnes ajoutées qui ne sont pas dans la source. Les colonnes sont "identifiant fiscal réel" et "le taxid est un artificiel programmé". Donc le fait d'avoir le pas dans le proc est plus un moyen de communiquer aux humains en utilisant le proc que "c'est le point de non-retour, vous devez composer le numéro de taxis ici si vous n'en avez pas un valide" . – TortTupper

Répondre

2

Plutôt que d'ajouter une colonne comme celui-ci, puis mettre à jour sa valeur, vous pouvez ajouter une colonne avec une valeur par défaut

CREATE PROCEDURE w AS 

ALTER TABLE t ADD x char(1) NOT NULL CONSTRAINT abc DEFAULT 1 
+0

Solution élégante! Mais fonctionnera, je suppose, seulement si la nouvelle colonne ne permet pas NULL – abatishchev

+0

Merci, mais 1 n'est pas réellement la valeur que je veux là, je veux mettre à jour la nouvelle colonne à une valeur d'une clause "FROM"; J'ai juste eu 1 dans mon exemple comme espace réservé pour montrer quelque chose de simple qui a causé l'erreur. – TortTupper

+0

que d'abord obtenir la valeur dans varible et qu'utiliser ici sélectionnez @@ variable = 1 ALTER TABLE t AJOUTER x char (1) NON NULL CONTRAINTE abc DEFAULT @@ variable peut travailler pour vous –

3

ALTER TABLE dans le cadre du 1er TRANSACTION et UPDATE dans le contexte de 2nd:

CREATE PROCEDURE w 
AS 
    BEGIN TRAN 
     ALTER TABLE .. 
    COMMIT 

    BEGIN TRAN 
     UPDATE .. 
    COMMIT 
END 
+0

Sonne attactive mais je ne peux pas le faire fonctionner : CREATE PROCEDURE p AS BEGIN TRAN ALTER TABLE t ADD x CHAR (1) COMMIT BEGIN TRAN UPDATE t SET x = 1 COMMIT Si j'utilise "END", j'obtiens une erreur de syntaxe. Si je crée avec succès la procédure, je reçois toujours la même erreur si "x" n'existe pas au moment de l'exécution (et obtiendrait une autre erreur si elle existait) – TortTupper

+0

@TortTupper: Il semble que c'est une limitation de SQL Server. Que diriez-vous de déposer un bug sur MS.Connect? Je le mettrais en colère. Ma solution de contournement: créez deux SP distincts et appelez-les virage par virage. Ou créez un 3ème qui appellera 1er et 2ème – abatishchev

+0

@TortTupper: Une autre idée pourquoi cela arrive-t-il? SQL Server ne peut pas créer un SP accédant à une colonne qui n'existe pas encore pendant la création du SP. Alors peut-être votre tâche est encore impossible .. ( – abatishchev

-1

Je pense que vous devriez ajouter une instruction GO juste après la création. Le serveur Sql enverra le créer ainsi, et alors votre mise à jour fonctionnera bien.

0

Le problème que vous rencontrez est que votre mise à jour est en cours de validation par rapport à la table existante avant d'exécuter la procédure de création de votre procédure. Si vous êtes engagé à cela, il vous suffit de vous assurer que la table n'existe pas lorsque vous créez/modifiez la procédure, ce qui fait passer l'analyseur dans le chemin de résolution de nom différé en raison de l'inexistence objets. Une fois la procédure créée, vous pouvez créer votre table.

Je suppose que votre processus laisse tomber/crée la table déjà ou vous n'auriez vraiment pas vraiment besoin d'une procédure comme ceci de toute façon.

Questions connexes