2010-08-03 7 views
3

Dans SQL Server 2008, je souhaite ajouter une colonne à une table et la mettre à jour juste après, mais uniquement si la colonne n'a pas été créée auparavant. Je ne veux pas exécuter la mise à jour si la colonne a été créée auparavant.Comment puis-je mettre à jour une colonne nouvellement ajoutée dans la même instruction de traitement?

IF NOT EXISTS (SELECT * 
       FROM [INFORMATION_SCHEMA].[COLUMNS] 
      WHERE [TABLE_NAME] = 'SETTINGS' AND [COLUMN_NAME] = 'COLOR_SCHEME') 
BEGIN 
    ALTER TABLE [SETTINGS] 
    ADD [COLOR_SCHEME] int NULL 

    UPDATE [SETTINGS] 
    SET [COLOR_SCHEME] = 1 
END 

Mettre un « GO » après l'ajout de la colonne ne fonctionne pas parce que ce ne serait pas une déclaration de lot complet, mais si je tente de courir comme ça, je reçois l'erreur « , nom de colonne non valide 'SCHÉMA DE COULEUR'."

Des idées sur comment faire pour que la colonne existe lors de l'exécution de la mise à jour?

Répondre

4

Vous pouvez essayer d'utiliser SQL dynamique à la place de l'instruction alter:

DECLARE @SQL NVARCHAR(4000) 
SET @SQL='ALTER TABLE [SETTINGS] ADD [COLOR_SCHEME] int NULL' 
EXEC(@SQL) 
+0

Ooo, un nouveau concept pour moi, je vais essayer ça! –

+0

Cela a fonctionné, mais j'ai dû faire la partie mise à jour le SQL dynamique, sinon il se plaindrait encore d'une colonne qui n'existait pas: DECLARE @SQL NVARCHAR (4000) SET @SQL = 'UPDATE [SETTINGS] SET [COLOR_SCHEME] = 1 ' EXEC (@SQL) Merci beaucoup! –

+0

Magie noire pure; Merci. –

2

Une autre possibilité est d'enregistrer les critères IF dans les lots:

CREATE TABLE ##Temp_Add_Color_Scheme (new_column BIT) 
INSERT INTO ##Temp_Add_Color_Scheme VALUES (0) 

IF NOT EXISTS (SELECT * 
       FROM [INFORMATION_SCHEMA].[COLUMNS] 
       WHERE [TABLE_NAME] = 'SETTINGS' AND 
        [COLUMN_NAME] = 'COLOR_SCHEME') 
BEGIN 
    UPDATE ##Temp_Add_Color_Scheme SET new_column = 1 

    ALTER TABLE [SETTINGS] 
    ADD [COLOR_SCHEME] int NULL 
END 
GO 

DECLARE @new_column BIT 
SELECT @new_column = new_column FROM ##Temp_Add_Color_Scheme 

IF (@new_column = 1) 
BEGIN 
    UPDATE [SETTINGS] 
    SET [COLOR_SCHEME] = 1 
END 

DROP TABLE ##Temp_Add_Color_Scheme 
+0

C'est intelligent aussi, upvote! –

0

Si le contenu de la colonne est fixée, Ne pouvez-vous pas simplement mettre une valeur par défaut au lieu de la mettre à jour?

ALTER TABLE [SETTINGS] 
    ADD [COLOR_SCHEME] int NULL 
    DEFAULT 1 WITH VALUES ; 
+0

En fait, les valeurs par défaut proviennent d'une autre instruction select, je l'ai juste laissé de côté pour simplifier cette question. Merci quand même! –

Questions connexes