Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Update столбца сразу после его добавления  [new]
Browny
Member

Откуда:
Сообщений: 53
Извиняюсь, если вопрос уже звучал на форуме.
MS-SQL 2005. Тестирование - в SQL Management Studio, в дальнейшем - выполнение из osql.exe. Задача: проверить существование столбца, если не существует - то создать и сделать апдейт для этого столбца.
Ошибка: в момент выполнения говорит, что столбца DATE_MODIFY не существует...
Причина, думается, в том, что транзакция, ещё не завершившись, не позволяет прочитать изменения схемы перед обновлением столбца.
Возможно, где-то здесь должен стоять GO как ограничитель батча, но простая его подстановка в, как казалось, очевидные места, к успеху не привела.
Как быть?

If (Not Exists (Select 1 from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='NODE' and COLUMN_NAME='DATE_MODIFY'))
 Begin
  alter table NODE add DATE_MODIFY datetime
  DECLARE @now_date datetime
  SELECT @now_date = GETDATE()
  Update NODE set DATE_MODIFY=@now_date
 End

Заведомо благодарю!
22 июн 09, 14:56    [7328722]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
И так не работает?
If (Not Exists (Select 1 from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='NODE' and COLUMN_NAME='DATE_MODIFY'))
 alter table NODE add DATE_MODIFY datetime
GO
DECLARE @now_date datetime
SELECT @now_date = GETDATE()
Update NODE set DATE_MODIFY=@now_date
22 июн 09, 15:02    [7328768]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
Browny
Member

Откуда:
Сообщений: 53
Fire83, у самого был такой вариант, но: обновлять надо только тогда, когда ранее столбца не существовало. А делать переменную-флаг, хранящую состояние был-не был столбец - как она потом передастся в другой батч? Это не станет проблемой?
22 июн 09, 15:05    [7328800]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
Browny
Member

Откуда:
Сообщений: 53
If (Not Exists (Select 1 from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='NODE' and COLUMN_NAME='DATE_MODIFY'))
 alter table NODE add DATE_MODIFY datetime
GO
DECLARE @now_date datetime
SELECT @now_date = GETDATE()
Update NODE set DATE_MODIFY=@now_date
Incorrect syntax near GO
22 июн 09, 15:07    [7328819]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
IF COLUMNPROPERTY(OBJECT_ID(N'NODE','U'),N'DATE_MODIFY','AllowsNull') IS NULL
BEGIN
 ALTER TABLE NODE ADD DATE_MODIFY DATETIME;
 EXEC(N'UPDATE NODE SET DATE_MODIFY=GETDATE()');
END;
22 июн 09, 15:07    [7328825]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
1. таблица в которой хранится, что столбец создан.
2. временная таблица, в которой писать 0/1, что столбец создан. временные таблицы видны между пакетами.

для спящего время бодрствования равносильно сну
22 июн 09, 15:08    [7328833]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
If (Not Exists (Select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='NODE' and COLUMN_NAME='DATE_MODIFY'))

  alter table NODE add DATE_MODIFY datetime not null default(getdate());
22 июн 09, 15:10    [7328851]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
Browny
Member

Откуда:
Сообщений: 53
iap, благодарю!
Если Вас не затруднит, оставьте комментарий-пояснение, в чём была причина и как это делать правильно. Это было бы полезно для меня и, возможно, других. Я вижу, что Вы вынесли апдейт в отдельный батч..
Впрочем, это, разумеется, на Ваше усмотрение :)
Спасибо!
22 июн 09, 15:12    [7328862]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
Browny
Member

Откуда:
Сообщений: 53
tpg, тоже вариант, спасибо! Но я намеренно не поставил значение по умолчанию как функцию - в дальнейшем значение по умолчанию должно быть NULL.
22 июн 09, 15:14    [7328879]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а что не понятного?

для спящего время бодрствования равносильно сну
22 июн 09, 15:20    [7328934]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
Glory
Member

Откуда:
Сообщений: 104760
Browny
iap, благодарю!
Если Вас не затруднит, оставьте комментарий-пояснение, в чём была причина и как это делать правильно. Это было бы полезно для меня и, возможно, других. Я вижу, что Вы вынесли апдейт в отдельный батч..
Впрочем, это, разумеется, на Ваше усмотрение :)
Спасибо!

BOL - Batches
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/111e21b6-5243-455c-9b0a-d19f8c66d14a.htm

A table cannot be changed and then the new columns referenced in the same batch.
22 июн 09, 15:33    [7329016]     Ответить | Цитировать Сообщить модератору
 Re: Update столбца сразу после его добавления  [new]
iljy
Guest
Browny
tpg, тоже вариант, спасибо! Но я намеренно не поставил значение по умолчанию как функцию - в дальнейшем значение по умолчанию должно быть NULL.

так сделайте вот так:

If (Not Exists (Select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='NODE' and COLUMN_NAME='DATE_MODIFY'))
begin
  alter table NODE add DATE_MODIFY datetime not null default(getdate());
  ALTER TABLE NODE ALTER COLUMN DATE_MODIFY datetime NULL
end

а jap вам предложил выполнять UPDATE динамическим запросом, который компилируется перед выполнением, т.е. когда поле уже существует.
22 июн 09, 15:33    [7329019]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить