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?
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! –
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) –
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