2010-11-23 10 views
1

J'utilise sql server 2005Vous avez besoin d'exécuter un script t-sql re-runnable qui crée une colonne (sinon Existant), puis effectuer certaines actions

l'idée est de créer une colonne, mettez à jour les valeurs à 0, il est non Nullable alors, et recréez une PK existante ajouter à la liste jusqu'à présent j'ai ceci:

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME = 'Division') 
BEGIN 
    ALTER TABLE MyTable ADD Division int NULL 
    UPDATE MyTable SET Division = 0 
    ALTER TABLE MyTable ALTER COLUMN Division int NOT NULL 

    ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [PK_MyTable] 

    ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
    (
     [ID] ASC, 
     [OfferCode] ASC, 
     [StationCode] ASC, 
     [Market] ASC, 
     [Division] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

END 

le problème est que j'ai besoin d'une déclaration « GO » afin que le nouveau colonne est créée, sinon j'obtiens une erreur en essayant de mettre à jour les valeurs à 0. Si je mets une instruction "GO", alors la clause if ne fonctionne pas (parce que la colonne existe maintenant). Je pensais mettre ce statut à une variable comme @ColumnWasCreated, mais l'instruction "GO" est comme démarrer un nouveau script, et la valeur de la variable est perdue des idées?

Répondre

2

OPTION 1

Au lieu de GO, essayez une TRANSACTION qui englobe le ADD COLUMN; puis engagez-le et voyez si vous pouvez UPDATE.

OPTION 2

essayez de définir une contrainte de valeur par défaut lorsque vous ADD COLUMN, de cette façon, vous n'aurez pas à UPDATE ou ALTER de ne pas permettre nulls.

+0

L'option 2 a fonctionné parfaitement (et pas besoin de créer des transactions). ALTER TABLE MyTable Division ADD int NON NULL DEFAUT 0 merci! –

+0

oups, juste réalisé. Je ne veux pas de valeur par défaut pour la colonne. est-il un moyen de l'enlever facilement après? (c'est une contrainte) –

+1

Oui, vous devriez pouvoir 'ALTER TABLE DROP CONSTRAINT'; voici le catch: vous avez besoin du nom de la contrainte qui est auto-généré si vous le créez avec la commande 'TABLE CREATE'. Vous aurez donc besoin d'une requête pour extraire la contrainte des tables de données 'sys'. – Brad