Вам не нужно использовать полный блок. Условие будет выполнять следующий оператор целиком, если вы не используете BEGIN/END - включая один оператор DDL. Это эквивалентно поведению , если в Pascal, C и т. Д. Конечно, это означает, что вам придется повторно проверять свое состояние снова и снова. Это также означает, что использование переменных для управления поведением сценария в значительной степени не может быть и речи.
[Edit: CREATE PROCEDURE не работает в приведенном ниже примере, поэтому я изменил его на что-то другое, и переехал CREATE PROCEDURE для более широкого обсуждения ниже]
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
...
Или что-то подобное, в зависимости от вашего состояния.
К сожалению, CREATE/ALTER PROCEDURE и CREATE/ALTER VIEW имеют особые требования, из-за которых сложнее работать. Они в значительной степени обязаны быть единственной вещью в заявлении, поэтому вы не можете комбинировать их с IF вообще.
Для многих сценариев, когда вы хотите «обновить» свои объекты, вы можете работать как условная капля, за которым следует создать:
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
Если вы действительно нужны условная логика, чтобы решить, что делать , тогда единственный способ, которым я знаю, - использовать EXECUTE для запуска операторов DDL в виде строки.
If ((SELECT Version FROM table WHERE...) <= 15)
EXECUTE 'CREATE PROC dbo.abc
AS
....
')
Но это очень больно. Вы должны избегать кавычек в теле процедуры, и ее действительно трудно прочитать.
В зависимости от изменений, которые вам необходимо применить, вы можете видеть все это может стать очень уродливым. Вышеприведенное не включает даже проверку ошибок, которая является королевской болью сама по себе. Вот почему полчища инструментальных мастеров зарабатывают себе на жизнь, выясняя способы автоматизации создания сценариев развертывания.
Извините; нет простого «правильного» способа, который работает на все. Это просто то, что TSQL поддерживает очень плохо. Тем не менее, вышеприведенное должно быть хорошим началом.
динамический SQL станет грязным очень скоро, так как у меня есть динамический SQL внутри самих –
OK процедур, несколько IF заявления затем ... – gbn