Je génère un script pour migrer automatiquement les modifications de plusieurs bases de données de développement vers la préparation / production. Fondamentalement, cela prend un tas de scripts de changement et les fusionne en un seul script, enveloppant chaque script dans une IF whatever BEGIN ... END
instruction.
Cependant, certains scripts nécessitent une GO
instruction afin que, par exemple, l'analyseur SQL connaisse une nouvelle colonne après sa création.
ALTER TABLE dbo.EMPLOYEE
ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO -- Necessary, or next line will generate "Unknown column: EMP_IS_ADMIN"
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
Cependant, une fois que j'enroule cela dans un IF
bloc:
IF whatever
BEGIN
ALTER TABLE dbo.EMPLOYEE ADD COLUMN EMP_IS_ADMIN BIT NOT NULL
GO
UPDATE dbo.EMPLOYEE SET EMP_IS_ADMIN = whatever
END
Il échoue parce que j'envoie un BEGIN
sans correspondance END
. Cependant, si je supprime le, GO
il se plaint à nouveau d'une colonne inconnue.
Existe-t-il un moyen de créer et de mettre à jour la même colonne dans un seul IF
bloc?
GO
doit être sur une ligne par lui-même, vous pouvez donc rechercher uniquement ce cas, et pas toutes les instances du mot GO
. 2) Vous pouvez toujours enregistrer les instructions qui ont été exécutées avec succès. Ou vous pouvez envelopper le tout dans un try / catch et utiliser vos propres numéros de ligne en utilisant une variable, comme @lineNo, dont vous gardez une trace et signalez l'erreur. Puisque vous les générez automatiquement, apporter des modifications comme celles-ci devrait être un jeu d'enfant. Il semble juste que vous ne vouliez pas explorer cette voie alors que je pense qu'il y a des solutions à trouver pour toutes vos préoccupations.