Этот сценарий не будет успешно запущен, если столбец уже не существует, а это именно то, когда вам не нужно .
Сценарии SQL должны быть проанализированы, прежде чем они могут быть выполнены. Если столбец не существует во время синтаксического анализа сценария, анализ не будет выполнен. Неважно, что ваши сценарии создают столбец позже; парсер не может этого знать.
Вам нужно вставить оператор GO
(разделитель пакетов), если вы хотите получить доступ к только что добавленному столбцу. Однако, как только вы это сделаете, вы больше не сможете поддерживать поток управления или переменные из предыдущего пакета - это все равно что запускать два отдельных сценария. Это усложняет одновременное выполнение DDL и DML, условно.
Самый простой обходной путь, который я, вероятно, рекомендовал бы для вас, поскольку ваш DML не очень сложен, - это использование динамического SQL, который синтаксический анализатор не будет пытаться анализировать до «выполнения»:
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'PurchaseOrder' AND COLUMN_NAME = 'IsDownloadable')
BEGIN
ALTER TABLE [dbo].[PurchaseOrder] ADD
[IsDownloadable] bit NOT NULL DEFAULT 0
EXEC sp_executesql
N'UPDATE [dbo].[PurchaseOrder] SET [IsDownloadable] = 1 WHERE [Ref] IS NOT NULL'
END