Здравствуйте, Glestwid, Вы писали:
G>Как тут быть? Внутрь IF GO не вставляется.
Ну, если нужно заполнить значение по умолчанию, то можно просто указать через DEFAULT:
alter table [dbo].T1 add InterID bigint not null default(2)
Как вариант — можно использовать динамический SQL — например, вызвать EXEC('update [dbo].T1 set InterID=2')
alter table [dbo].T1
add InterID bigint null
update [dbo].T1 set InterID=2
В результате получаю:
Msg 207, Level 16, State 1, Line 25
Invalid column name 'InterID'.
Таблица существаует, на момент вызова колонки InterID там нет, я — SA на сервере. Что ему не нравится?
Здравствуйте, Джеффри, Вы писали:
Д>Здравствуйте, Glestwid, Вы писали:
G>>Таблица существаует, на момент вызова колонки InterID там нет, я — SA на сервере. Что ему не нравится?
Д>Нужно разбить эти 2 запроса на отдельные батчи — поставь GO между ними.
Д>Когда SQL Server компилирует эти запросы как один батч — он видит, что колонки используемой во втором запросе нет в таблице и поэтому падает.
Это я уже понял опытным путем. Но тут есть нюанс. Эти 2 строки мне надо выполнить изнутри IF вместе с еще десятком строк:
if not exists (select 1 from information_schema.columns where table_name = 'T1' and column_name = 'InterID')
begin
update
...
alter
end
Как тут быть? Внутрь IF GO не вставляется.
Здравствуйте, Glestwid, Вы писали:
Д>>Нужно разбить эти 2 запроса на отдельные батчи — поставь GO между ними.
Д>>Когда SQL Server компилирует эти запросы как один батч — он видит, что колонки используемой во втором запросе нет в таблице и поэтому падает.
G>Это я уже понял опытным путем. Но тут есть нюанс. Эти 2 строки мне надо выполнить изнутри IF вместе с еще десятком строк:
G>G>if not exists (select 1 from information_schema.columns where table_name = 'T1' and column_name = 'InterID')
G>begin
G> update
G>...
G> alter
G>end
G>
G>Как тут быть? Внутрь IF GO не вставляется.
Объявить явную (можно даже именнованную) транзакцию и закоммитить после добавления колонки. Дальше продолжать в общем тебе IF.
Здравствуйте, Milena, Вы писали:
M>Объявить явную (можно даже именнованную) транзакцию и закоммитить после добавления колонки. Дальше продолжать в общем тебе IF.
можно ещё через exec/execute:
EXECUTE(N'alter table [dbo].T1 add InterID bigint null');