ALTER TABLE в процедуре
От: Spidola Россия http://www.usametrics.ru
Дата: 25.01.05 18:39
Оценка:
MS SQL 2000

Есть необходимость внутри процедуры создавать временную таблицу и потом добавлять в неё поле.

1.
CREATE TABLE #t (f1 int)
ALTER TABLE #t ADD id_t int identity
select id_t from #t

Указанный выше код (1) выдаёт ошибку исполнения (Invalid column name 'id_t'.). Мало того, код ниже (2) ошибки не выдаёт:

2.
CREATE TABLE #t (f1 int)
ALTER TABLE #t ADD id_t int identity 
select * from #t

Проверял в Query Analyzer. Первый код (1) тоже выдаёт ошибку исполнения (нет поля id_t). В QueryAnalyzer-е лечится так:

CREATE TABLE #t (f1 int)
ALTER TABLE #t ADD id_t int identity 
GO
select id_t from #t

Как вылечить в процедуре (вроде GO использовать нельзя). И, если не лечится, то почему?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: ALTER TABLE в процедуре
От: quaestor  
Дата: 25.01.05 22:15
Оценка:
S> И, если не лечится, то почему?

By design. Цитата из BOL: "A table cannot be altered and then the new columns referenced in the same batch."

А вообще, можно попробовать вот так:

CREATE TABLE #t (f1 int)
EXEC('ALTER TABLE #t ADD id_t int identity')
select id_t from #t
Re[2]: ALTER TABLE в процедуре
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.01.05 07:04
Оценка:
Здравствуйте, quaestor, Вы писали:

Q>А вообще, можно попробовать вот так:

точнее, наоборот:
CREATE TABLE #t (f1 int)
ALTER TABLE #t ADD id_t int identity
exec('select id_t from #t')
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: ALTER TABLE в процедуре
От: quaestor  
Дата: 26.01.05 09:18
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, quaestor, Вы писали:


Q>>А вообще, можно попробовать вот так:

S>точнее, наоборот:

работает и то, и то, просто в моем варианте вроде немножко удобнее обрабатывать возвращаемое селектом значение, если оно требуется на сервере.
Re[4]: ALTER TABLE в процедуре
От: Spidola Россия http://www.usametrics.ru
Дата: 26.01.05 12:03
Оценка:
Здравствуйте, quaestor, Вы писали:

Q>Здравствуйте, Sinclair, Вы писали:


S>>Здравствуйте, quaestor, Вы писали:


Q>>>А вообще, можно попробовать вот так:

S>>точнее, наоборот:

Q>работает и то, и то, просто в моем варианте вроде немножко удобнее обрабатывать возвращаемое селектом значение, если оно требуется на сервере.


Спасибо всем за помощь, однако в процедуре не сработало ни то, ни другое...
Причём в Query Analyzer-е заработали обе конструкции, однако в процедуре конструкция

CREATE TABLE #t (f1 int)
EXEC('ALTER TABLE #t ADD id_t int identity')
select id_t from #t

не сработала вовсе (та же ошибка), а конструкция

CREATE TABLE #t (f1 int)
ALTER TABLE #t ADD id_t int identity
exec('select id_t from #t')

начала давать другие ошибки на выполнении select-а через exec (в процедуре select существенно более сложный, естественно).

В результате проблема была обойдена следующим корявым, но работающим и интегрально менее затратным образом:

CREATE TABLE #t_temp (f1 int)
SELECT IDENTITY(int,1,1) id_t, f1 INTO #t FROM #t_temp
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.