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

Откуда: Самара
Сообщений: 234
Есть хранимая процедура

Нужно ее выполнить
EXEC <имя> , @p1, @p2

и результат - записать в табличную переменную

declare @ttt TABLE
чтобы потом сделать SELECT * from @ttt

Как ?
12 авг 13, 16:11    [14697733]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
insert @ttt EXEC <имя> , @p1, @p2
12 авг 13, 16:14    [14697762]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Glory
insert @ttt EXEC <имя> , @p1, @p2
Помнится, в 2000м с табличной переменной это не работало?
(могу ошибаться)
12 авг 13, 16:16    [14697776]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Empirical
Member

Откуда:
Сообщений: 99
iap,

insert into #tab select * from openrowset( 'SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;','EXEC <имя> , @p1, @p2') as tab
select * from #tab 
13 авг 13, 23:56    [14705287]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Empirical
iap,

insert into #tab select * from openrowset( 'SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;','EXEC <имя> , @p1, @p2') as tab
select * from #tab 
Не сработает. @p не получится передать.
14 авг 13, 00:02    [14705310]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Empirical
Member

Откуда:
Сообщений: 99
alexeyvg,

а динамика не поможет?
14 авг 13, 00:31    [14705402]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
iap
Glory
insert @ttt EXEC <имя> , @p1, @p2
Помнится, в 2000м с табличной переменной это не работало?
(могу ошибаться)
Начиная с 2005 эта конструкция валидна.
14 авг 13, 06:41    [14705647]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Empirical
alexeyvg,

а динамика не поможет?
Нет, ведь тогда всё равно придётся использовать insert @ttt EXEC, только из динамики.
14 авг 13, 08:53    [14705820]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
alm2
Есть хранимая процедура

Нужно ее выполнить
EXEC <имя> , @p1, @p2

и результат - записать в табличную переменную

declare @ttt TABLE
чтобы потом сделать SELECT * from @ttt

Как ?

если не секрет а поченму табличная переменная,а не простоя временная таблица то ? Если север 2000
14 авг 13, 09:37    [14705931]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
tpg
iap
пропущено...
Помнится, в 2000м с табличной переменной это не работало?
(могу ошибаться)
Начиная с 2005 эта конструкция валидна.
Про 2005 я и не сомневаюсь :))
14 авг 13, 09:57    [14706023]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
Glory
insert @ttt EXEC <имя> , @p1, @p2
Помнится, в 2000м с табличной переменной это не работало?
(могу ошибаться)

Что интересно, текст соответствующего сообщения об ошибке сохранился даже в SQL Server 2012:
SELECT * FROM sys.messages WHERE message_id = 197 AND language_id IN (1033, 1049)

message_id language_id severity is_event_logged text
197 1033 15 0 EXECUTE cannot be used as a source when inserting into a table variable.
197 1049 15 0 Нельзя использовать EXECUTE в качестве источника при вставке в табличную переменную.
14 авг 13, 12:23    [14707041]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
Гость333
Что интересно, текст соответствующего сообщения об ошибке сохранился даже в SQL Server 2012:

чтобы compatibilty level базы работал наверное
14 авг 13, 12:32    [14707105]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Barkan
Member

Откуда: Дремучее заМКАДье
Сообщений: 504
alm2
Есть хранимая процедура

Нужно ее выполнить
EXEC <имя> , @p1, @p2

и результат - записать в табличную переменную

declare @ttt TABLE
чтобы потом сделать SELECT * from @ttt

Как ?


А почему бы не сделать функцию возвращающую таблицу?
И делай себе на здоровье: select * from MyTableValuedFunction
14 авг 13, 13:27    [14707534]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Glory
Гость333
Что интересно, текст соответствующего сообщения об ошибке сохранился даже в SQL Server 2012:

чтобы compatibilty level базы работал наверное

1) Но в 2012 минимальный compatibilty level — это 2005;
2) Нашёл некую БД в режиме совместимости с 2000, на сервере с MSSQL 2005 — в ней без проблем работает insert-exec в табличную переменную.

В общем, какое-то забытое в чулане сообщение об ошибке :)
14 авг 13, 13:29    [14707544]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Barkan
А почему бы не сделать функцию возвращающую таблицу?
Наверное, не получается. Функции же сильно ограничены по сравнению с процедурами.

Ну и собственно решение может быть в использовании временных таблиц. Просто у ТС конкретный вопрос - именно процедура и таблица-переменная.
14 авг 13, 13:43    [14707663]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Только сейчас дошло (формализовал) почему процка с SELECTами плохой подход.
Интерфейс должен быть предопределён.
Т.е. CREATE кучи #-ок, EXEC процки с заливкой в # - куда лучше. Ближе к понятию OUT параметров.
И конечно лучше будет когда добавят выходные таблички.

Слоупок.

А вот прикол WITH result_sets_definition пока не догоняю.
Гарантия это хорошо, но интерфейс INSERT-EXEC говёный не только со 100500 проблемами, но и вообще не вписывается на множественный результат.
14 авг 13, 13:50    [14707723]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
alexeyvg
Наверное, не получается. Функции же сильно ограничены по сравнению с процедурами.
Намного?
И вообще "намного" можно сказать двояко.
- Намного часто нарываешься
- много ограничений по количеству/перечислению (но не по вероятности).

Я бы не сказал что нарываешься часто. Я принуждал делать функции и в итоге не пожалел.
14 авг 13, 13:55    [14707761]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Mnior
Т.е. CREATE кучи #-ок, EXEC процки с заливкой в # - куда лучше
К сожалению, это вызывает перекомпиляцию, так что применимо очень ограниченно, только для тяжёлых отчётов.

Mnior
И конечно лучше будет когда добавят выходные таблички.
Ага, боремся уже больше 10 лет (то уже есть обещают больше 10 лет).
Mnior
alexeyvg
Наверное, не получается. Функции же сильно ограничены по сравнению с процедурами.
Намного?
Ну, раз не получается, значит намного :-)
Может, там в процедурах обновления данных? Или используется куча временных таблиц?
14 авг 13, 17:59    [14709421]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
_ч_
Member

Откуда:
Сообщений: 1446
alexeyvg
Mnior
Т.е. CREATE кучи #-ок, EXEC процки с заливкой в # - куда лучше
К сожалению, это вызывает перекомпиляцию, так что применимо очень ограниченно, только для тяжёлых отчётов.


Если операция разовая, но частая, то можно и на табличку в базе разжиться. Просто очищать её, например по @@spid.
14 авг 13, 18:25    [14709552]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
_ч_
alexeyvg
К сожалению, это вызывает перекомпиляцию, так что применимо очень ограниченно, только для тяжёлых отчётов.

Если операция разовая, но частая, то можно и на табличку в базе разжиться. Просто очищать её, например по @@spid.
Да можно разные варианты придумать, но у всех какие то мелкие недостатки :-(

Например, недостаток постоянной таблицы - в транзакциях не очень, будут блокировки :-(
14 авг 13, 19:40    [14709756]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
_ч_
Если операция разовая, но частая, то можно и на табличку в базе разжиться. Просто очищать её, например по @@spid.
А это тоже приводит к рекомпиляции (не постоянной). Ведь смена статистики приводит к убиванию планов.
А с другой стороны можно её запретить обновляться. И планы можно закрепить.

Может поэтому у оракакла времянки так организованы.
alexeyvg
К сожалению, это вызывает перекомпиляцию, так что применимо очень ограниченно, только для тяжёлых отчётов.
Ну, не так страшен чёрт. Иногда это меньшее из зол. INSERT-EXEC чаще хуже.
Мне важно показать правильность подхода, а не убогость реализации.
Естественно что рекомпилится, структура же не известна и не закреплена, декларативно, как должно было быть.
alexeyvg
Ну, раз не получается, значит намного :-)
Во-во, явно видно что не можете сказать, ибо не было анализа.
По глазам читаю
alexeyvg
Может, там в процедурах обновления данных? Или используется куча временных таблиц?
Не надо путать операционные процедуры с тупым доставанием данных.
В больше части практики проблем нет никаких. Функциональные процедуры (table-values-function) вещь очень редкостная, а превращение в них из параметризованных представлений (inline-function) подавно.

Другое дело смена процесса. Если, вдруг, надо логировать, то смотрится простым - тупо добавить в процке.
И вот это "смотрится простым" всё портит.
Притом оно "смотрится простым" только дибилеям, ибо людей которые "базу не трожь, меняй прогу" на самом деле не меньше, чем кому-то кажется.
alexeyvg
Ага, боремся уже больше 10 лет (то уже есть обещают больше 10 лет).
Relax restriction that table parameters must be readonly when SPs call each other.
Налетай!

Я кстати только сейчас проголосовал.
14 авг 13, 19:48    [14709773]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
alexeyvg
Например, недостаток постоянной таблицы - в транзакциях не очень, будут блокировки :-(
А чё вдруг?
Может просто в другом: "Организовать нормально процесс с постоянками сложновато, возни много."
Типа надо вводить ключ процесса, следить за тем чтоб локи не эскалировались, статистика ...
Это?
14 авг 13, 19:52    [14709784]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Mnior
alexeyvg
Ага, боремся уже больше 10 лет (то уже есть обещают больше 10 лет).
Relax restriction that table parameters must be readonly when SPs call each other.
Налетай!
Да, налетаем, с 2007 года висит, щас прям сделают :-)
Там даже Erland Sommarskog выступил, не помогло.

Эта история тянется давно, обещали сделать табличные параметры, но неожиданно сделали readonly, чего никто не ожидал.
А сейчас никто не будет заниматься, с точки зрения карьеры любого менеджера это бесперспективная вещь, никто не будет проталкивать. Хоть и ответили "We have recieved similar feedback from a large number of customers"
Mnior
alexeyvg
К сожалению, это вызывает перекомпиляцию, так что применимо очень ограниченно, только для тяжёлых отчётов.
Ну, не так страшен чёрт. Иногда это меньшее из зол. INSERT-EXEC чаще хуже.
Нет-нет, для OLTP просто неприемлимо. Перекомпиляция из за внешних временных таблиц потребляет 99% процессорного времени.
Mnior
Естественно что рекомпилится, структура же не известна и не закреплена, декларативно, как должно было быть.
Технически не естественно, достаточно просто избежать перекомпиляции.
Достаточно записывать сигнатуру таблицы и перекомпилировать, только если она изменилась.

Просто никто не подумал. Проблема команды SQL Server Database Engine в том, что там есть разработчики сиквела, но нет пользователей :-)
Mnior
alexeyvg
Например, недостаток постоянной таблицы - в транзакциях не очень, будут блокировки :-(
А чё вдруг?
Может просто в другом: "Организовать нормально процесс с постоянками сложновато, возни много."
Типа надо вводить ключ процесса, следить за тем чтоб локи не эскалировались, статистика ...
Это?
Ну да, "возни много" - это же затраты!
Там возня и на создание этих таблиц, нужны же разные структуры для разных целей. Согласитесь, передать параметр в процедуру должно делаться проще. чем вышеописанное :-)

В общем, решений-то много, но у каждого находятся недостатки.
15 авг 13, 00:20    [14710704]     Ответить | Цитировать Сообщить модератору
 Re: Нужно вернуть значение из хранимой процедуры  [new]
_ч_
Member

Откуда:
Сообщений: 1446
Mnior
_ч_
Если операция разовая, но частая, то можно и на табличку в базе разжиться. Просто очищать её, например по @@spid.
А это тоже приводит к рекомпиляции (не постоянной). Ведь смена статистики приводит к убиванию планов.
А с другой стороны можно её запретить обновляться. И планы можно закрепить.

Может поэтому у оракакла времянки так организованы.
[/quot]
Из двух зол выбирают меньшую
15 авг 13, 11:29    [14711836]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить