Non è necessario utilizzare un blocco completo. Un condizionale eseguirà l'istruzione successiva nella sua interezza se non si utilizza un BEGIN/END, inclusa una singola istruzione DDL. Questo è equivalente al comportamento di se in Pascal, C, ecc. Ovviamente, ciò significa che dovrai ricontrollare le tue condizioni più e più volte. Significa anche che l'utilizzo di variabili per controllare il comportamento dello script è praticamente fuori questione.
[Edit: CREATE PROCEDURE non funziona nell'esempio qui sotto, quindi l'ho cambiato a qualcosa d'altro e si trasferisce CREATE PROCEDURE per una discussione più estesa sotto]
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
...
O qualcosa del genere, a seconda di quale sia la tua condizione.
Sfortunatamente, CREATE/ALTER PROCEDURE e CREATE/ALTER VIEW hanno requisiti speciali che rendono molto più difficile lavorare con. Sono praticamente obbligati a essere l'unica cosa in una dichiarazione, quindi non è possibile combinarli con IF.
Per molti scenari, quando si vuole "aggiornare" gli oggetti, si può lavorare come una goccia condizionale seguito da un creare:
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
Se si ha realmente bisogno la logica condizionale per decidere cosa fare , quindi l'unico modo che conosco è usare EXECUTE per eseguire le istruzioni DDL come una stringa.
If ((SELECT Version FROM table WHERE...) <= 15)
EXECUTE 'CREATE PROC dbo.abc
AS
....
')
Ma questo è molto doloroso. Devi sfuggire a qualsiasi citazione nel corpo della procedura ed è davvero difficile da leggere.
A seconda delle modifiche che è necessario applicare, è possibile vedere tutto questo può diventare molto brutto veloce. Quanto sopra non include nemmeno il controllo degli errori, che è un dolore reale tutto da solo. Questo è il motivo per cui orde di produttori di utensili si guadagnano da vivere cercando di capire come automatizzare la creazione di script di implementazione.
Siamo spiacenti; non esiste un modo "giusto" facile che funzioni per tutto. Questo è solo qualcosa che TSQL supporta molto male. Tuttavia, quanto sopra dovrebbe essere un buon inizio.
SQL dinamico sarebbe diventato disordinato molto presto, dal momento che ho SQL dinamico all'interno delle procedure stesse –
OK, multipla IF THEN ... – gbn