Результат хранимой процедуры в табличную переменную
От: Аноним  
Дата: 03.07.07 07:40
Оценка:
Вопрос: 2000й скул можно заставить запихнуть результат хранимой процедуры в табличную переменную?

MSSQL 2005, пишем к примеру
-- табличная переменная для инфы по первичным ключам
DECLARE @pk_info table ( TABLE_QUALIFIER varchar (100), TABLE_OWNER varchar (100), TABLE_NAME varchar (100), COLUMN_NAME varchar (100), KEY_SEQ varchar (100), PK_NAME varchar (100))    

-- получаем инфу по ключам таблицы
insert @pk_info exec sp_pkeys @tab_name;


все работает...

тот же скрипт на 2000м скуле дает

EXECUTE cannot be used as a source when inserting into a table variable.


Конечно можно воспользоваться временной таблицой, но просто не хотелось бы по ряду причин.
Особенно удручает тот факт, что фактически везде одно и то же: "Используйте табличные переменные где можете" =(
Re: Результат хранимой процедуры в табличную переменную
От: MasterZiv СССР  
Дата: 03.07.07 09:52
Оценка:
Аноним 972 пишет:

> Конечно можно воспользоваться временной таблицой, но просто не хотелось

> бы по ряду причин.

Какие причины ? ВОобще , временные таблицы и табличные переменные — это
одно и то же. Разница только в синтаксисе.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Результат хранимой процедуры в табличную переменную
От: Lloyd Россия  
Дата: 03.07.07 09:56
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> Конечно можно воспользоваться временной таблицой, но просто не хотелось

>> бы по ряду причин.

MZ>Какие причины ? ВОобще , временные таблицы и табличные переменные — это

MZ>одно и то же. Разница только в синтаксисе.

Как минимум еще время жизни.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Результат хранимой процедуры в табличную переменную
От: DuШes  
Дата: 03.07.07 10:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос: 2000й скул можно заставить запихнуть результат хранимой процедуры в табличную переменную?


А>MSSQL 2005, пишем к примеру

А>
А>-- табличная переменная для инфы по первичным ключам
А>DECLARE @pk_info table ( TABLE_QUALIFIER varchar (100), TABLE_OWNER varchar (100), TABLE_NAME varchar (100), COLUMN_NAME varchar (100), KEY_SEQ varchar (100), PK_NAME varchar (100))    

А>-- получаем инфу по ключам таблицы
А>insert @pk_info exec sp_pkeys @tab_name;    
А>


А>все работает...


А>тот же скрипт на 2000м скуле дает


А>
А>EXECUTE cannot be used as a source when inserting into a table variable.
А>


А>Конечно можно воспользоваться временной таблицой, но просто не хотелось бы по ряду причин.

А>Особенно удручает тот факт, что фактически везде одно и то же: "Используйте табличные переменные где можете" =(

известная проблема mssql 2000, если в хранимке используется уже insert into, то ее нельзя использовать извне для такой же операции — с этим связана головная боль при работе с системными процедурами...я вышел из такой ситуации просто выдрав код sp_keys (sp_helptext или же просто через посмотрев в master) и написав свою процедуру, которая — ЕСЛИ нет временной таблицы с определенным именем, она ее создает и ложит туда результаты при помощи возвращаемого select-а и в конце сама делает select, если уже есть, очищает ее и также помещает результат, но в данном случае в конце select не делает.
Таким образом, если нам надо получить результат, создаем сначала временную таблицу определенной структуры (едиственный жирный минус такого подхода), запускаем хранимку, после выполнения результат у нас в temporary table, если же нужно просто посмотреть результат выполнения для административных целей, просто запускаем хранимку.
Re[2]: Результат хранимой процедуры в табличную переменную
От: andsm Россия  
Дата: 04.07.07 11:29
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Аноним 972 пишет:


>> Конечно можно воспользоваться временной таблицой, но просто не хотелось

>> бы по ряду причин.

MZ>Какие причины ? ВОобще , временные таблицы и табличные переменные — это

MZ>одно и то же. Разница только в синтаксисе.

Попробовал вспомнить отличия, сходу припомнил несколько отличий:

1. Невозможность создать индексы на переменной, кроме первичного
2. Отсутствие поддержки статистик на табличных переменных
3. Соответственно, отсутствие рекомпиляций вызванных изменениями статистик
4. Джойны с табличными переменными — всегда loop joins, так как при отсутствии статистики оптимизатор подразумевает что данных там немного.
5. Отсутствие поддержки внешнего контекста транзакции (только statement based транзакции), соответственно разница в логировании в tempdb лог
6. Область видимости
Re[3]: Результат хранимой процедуры в табличную переменную
От: Аноним  
Дата: 05.07.07 06:47
Оценка:
Всем спасибо за развернуты ответ
Re[3]: Результат хранимой процедуры в табличную переменную
От: _d_m_  
Дата: 05.07.07 07:01
Оценка:
Здравствуйте, andsm, Вы писали:

A>Попробовал вспомнить отличия, сходу припомнил несколько отличий:


A>1. Невозможность создать индексы на переменной, кроме первичного

A>2. Отсутствие поддержки статистик на табличных переменных
A>3. Соответственно, отсутствие рекомпиляций вызванных изменениями статистик
A>4. Джойны с табличными переменными — всегда loop joins, так как при отсутствии статистики оптимизатор подразумевает что данных там немного.
A>5. Отсутствие поддержки внешнего контекста транзакции (только statement based транзакции), соответственно разница в логировании в tempdb лог
A>6. Область видимости

7. При использовании в хранимых процедурах переменных table приходится прибегать к повторным компиляциям реже, чем при использовании временных таблиц.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.