Vous n'avez pas besoin d'utiliser un bloc complet. Un conditionnel exécutera l'instruction suivante dans son intégralité si vous n'utilisez pas BEGIN/END - y compris une seule instruction DDL. Ceci est équivalent au comportement de si en Pascal, C, etc. Bien sûr, cela signifie que vous devrez revérifier votre état encore et encore et encore. Cela signifie également que l'utilisation de variables pour contrôler le comportement du script est pratiquement hors de question.
[Edit: CREATE PROCEDURE ne fonctionne pas dans l'exemple ci-dessous, donc je l'ai changé à quelque chose d'autre et déplacé CREATE PROCEDURE pour une plus longue discussion ci-dessous]
If ((SELECT Version FROM table WHERE...) <= 15)
CREATE TABLE dbo.MNP (
....
)
GO
If ((SELECT Version FROM table WHERE...) <= 15)
ALTER TABLE dbo.T1
ALTER COLUMN Field1 AS CHAR(15)
GO
...
Ou quelque chose comme ça, en fonction de votre condition.
Malheureusement, CREATE/ALTER PROCEDURE et CREATE/ALTER VIEW ont des exigences particulières qui rendent le travail beaucoup plus difficile. Ils sont à peu près obligatoires pour être la seule chose dans une déclaration, donc vous ne pouvez pas les combiner avec IF du tout.
Pour de nombreux scénarios, quand vous voulez « mettre à jour » vos objets, vous pouvez travailler comme une baisse conditionnelle suivie d'une créer:
IF(EXISTS(SELECT * FROM sys.objects WHERE type='p' AND object_id = OBJECT_ID('dbo.abc')))
DROP PROCEDURE dbo.abc
GO
CREATE PROCEDURE dbo.abc
AS
...
GO
Si vous avez vraiment besoin d'une logique conditionnelle de décider quoi faire , alors la seule façon que je connaisse est d'utiliser EXECUTE pour exécuter les instructions DDL sous forme de chaîne.
If ((SELECT Version FROM table WHERE...) <= 15)
EXECUTE 'CREATE PROC dbo.abc
AS
....
')
Mais c'est très douloureux. Vous devez échapper à toutes les citations dans le corps de la procédure et c'est vraiment difficile à lire. En fonction des modifications que vous devez appliquer, vous pouvez voir que tout cela peut devenir très laid rapidement. Ce qui précède ne comprend même pas la vérification des erreurs, qui est une douleur royale tout seul. C'est pourquoi des hordes d'outilleurs gagnent leur vie en trouvant des moyens d'automatiser la création de scripts de déploiement.
Désolé; il n'y a pas de "juste" moyen facile qui fonctionne pour tout. C'est juste quelque chose que TSQL supporte très mal. Pourtant, ce qui précède devrait être un bon début.
SQL dynamique deviendrait désordre très vite, puisque j'ai sql dynamique dans les procédures elles-mêmes –
OK, plusieurs instructions IF puis ... – gbn