У меня есть этот скрипт изменения SQL, который работает как часть моего NAnt спланированного создания БД или обновления:Почему проверка существующего отказа столбца в SQL?
SET XACT_ABORT ON
BEGIN TRANSACTION
PRINT 'Change MyColumn column to MyNewColumn column in MyTable table'
IF EXISTS (SELECT *
FROM sys.columns
WHERE Name = 'MyColumn' AND Object_id = OBJECT_ID('[dbo].[MyTable]'))
BEGIN
PRINT '-> Exists, change it'
/* NOTE THE NEXT LINE */
SET @Value = (SELECT MyColumn FROM [dbo].[MyTable])
ALTER TABLE [dbo].[MyTable]
DROP CONSTRAINT DF_MyTable_MyColumn
ALTER TABLE [dbo].[MyTable]
DROP COLUMN MyColumn
ALTER TABLE [dbo].[MyTable]
ADD MyNewColumn nvarchar(20) NULL
ALTER TABLE [dbo].[MyTable]
ADD CONSTRAINT DF_MyTable_MyNewColumn DEFAULT ('') FOR MyNewColumn
PRINT '-> Add values back into table'
SET @Dynamic_Sql = 'UPDATE [dbo].[MyTable] SET MyNewColumn = ''' + @Value + ''''
EXEC(@Dynamic_Sql)
PRINT '-> Alter to NOT NULL'
ALTER TABLE [dbo].[MyTable]
ALTER COLUMN MyNewColumn nvarchar(20) NOT NULL
END
ELSE
BEGIN
PRINT '-> Does not exist, skip it'
END
Я уже запустил этот скрипт обновления до и внесения изменений в БД (так MyColumn больше не существует) , Но теперь у меня есть новый сценарий, который приходит после этого, но моя «сборка» не будет работать на этой линии этого сценария с:
Msg 207, Level 16, State 1, Line именем 15 Неверного столбца «MyColumn '
, где Строка 15 - это строка FROM sys.columns. Но на самом деле он жалуется на строку, которая у меня есть внутри оператора IF, где я добавил комментарий NOTE. Почему это должно быть поведением? Конечно, имя столбца будет недействительным, если оно больше не существует.
Можете ли вы включить полный сценарий? Или, по крайней мере, следующие 15-20 строк? Имя столбца появляется где-нибудь еще? Как я уже говорил ниже, номер строки часто может быть неточным, и я не вижу, как вы могли получить это сообщение об ошибке для этой строки, считая, что «MyColumn» - это просто строка, а не имя столбца. –
@Tom, я редактировал вопрос, чтобы включить то, что вы просили, и, очевидно, у меня есть некоторые недоразумения относительно операторов IF и корректности скрипта в SQL. –