MSSQL - Что не так с UPDATE после alter table?
От: Glestwid  
Дата: 17.12.19 12:41
Оценка:
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 на сервере. Что ему не нравится?
Re: MSSQL - Что не так с UPDATE после alter table?
От: Джеффри  
Дата: 17.12.19 12:44
Оценка: 1 (1) +3
Здравствуйте, Glestwid, Вы писали:

G>Таблица существаует, на момент вызова колонки InterID там нет, я — SA на сервере. Что ему не нравится?


Нужно разбить эти 2 запроса на отдельные батчи — поставь GO между ними.

Когда SQL Server компилирует эти запросы как один батч — он видит, что колонки используемой во втором запросе нет в таблице и поэтому падает.
Re[2]: MSSQL - Что не так с UPDATE после alter table?
От: Glestwid  
Дата: 17.12.19 12:55
Оценка:
Здравствуйте, Джеффри, Вы писали:

Д>Здравствуйте, 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 не вставляется.
Re[3]: MSSQL - Что не так с UPDATE после alter table?
От: Джеффри  
Дата: 17.12.19 13:01
Оценка: 2 (1) +2
Здравствуйте, Glestwid, Вы писали:

G>Как тут быть? Внутрь IF GO не вставляется.


Ну, если нужно заполнить значение по умолчанию, то можно просто указать через DEFAULT:

alter table [dbo].T1 add InterID bigint not null default(2)


Как вариант — можно использовать динамический SQL — например, вызвать EXEC('update [dbo].T1 set InterID=2')
Re[3]: MSSQL - Что не так с UPDATE после alter table?
От: Milena США  
Дата: 18.12.19 02:58
Оценка:
Здравствуйте, 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.
Re[4]: MSSQL - Что не так с UPDATE после alter table?
От: Igorxz  
Дата: 18.12.19 11:51
Оценка:
Здравствуйте, Milena, Вы писали:

M>Объявить явную (можно даже именнованную) транзакцию и закоммитить после добавления колонки. Дальше продолжать в общем тебе IF.


можно ещё через exec/execute:
EXECUTE(N'alter table [dbo].T1 add InterID bigint null');
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.