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>>
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
Здравствуйте, 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>>
Здравствуйте, 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>>