No necesita utilizar un bloque completo. Un condicional ejecutará la siguiente instrucción en su totalidad si no utiliza un BEGIN/END, incluyendo una sola instrucción DDL. Esto es equivalente al comportamiento de si en Pascal, C, etc. Por supuesto, eso significa que tendrá que volver a verificar su condición una y otra vez. También significa que el uso de variables para controlar el comportamiento del guión es casi imposible.
[Editar: CREATE procedimiento no funciona en el ejemplo de abajo, así que lo cambiaron a otra cosa y se trasladó CREATE PROCEDURE para una discusión más extendida abajo]
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 algo por el estilo, dependiendo de cual es tu condición
Desafortunadamente, CREAR/ALTERAR PROCEDIMIENTO y CREAR/ALTERAR VER tienen requisitos especiales que hacen que sea mucho más difícil trabajar con él. Se requiere que sean lo único en una declaración, por lo que no se pueden combinar con IF.
Para muchos escenarios, cuando se quiere "actualizar" sus objetos, se puede trabajar como una gota condicional seguido de un crear:
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 realmente necesita lógica condicional para decidir qué hacer , entonces la única forma que conozco es usar EXECUTE para ejecutar las instrucciones DDL como una cadena.
If ((SELECT Version FROM table WHERE...) <= 15)
EXECUTE 'CREATE PROC dbo.abc
AS
....
')
Pero esto es muy doloroso. Tiene que escapar de las comillas en el cuerpo del procedimiento y es realmente difícil de leer.
Dependiendo de los cambios que necesite aplicar, puede ver que todo esto puede ponerse muy feo rápidamente. Lo anterior ni siquiera incluye la comprobación de errores, que es un dolor real por sí solo. Esta es la razón por la cual hordas de fabricantes de herramientas se ganan la vida al descubrir formas de automatizar la creación de scripts de implementación.
Lo sentimos; no hay una manera fácil y "correcta" que funcione para todo. Esto es algo que TSQL soporta muy mal. Aún así, lo anterior debería ser un buen comienzo.
SQL dinámico se convertiría desordenado muy pronto, ya que tengo SQL dinámico dentro de los propios procedimientos –
OK, múltiples instrucciones IF ... luego – gbn