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

Откуда:
Сообщений: 161
Добрый день!

Есть старая SP, писанная не одним поколением с сотней некомментированных строк.
SP возвращает таблицу с тремядесятками полей.

Как воспользоваться результатом для дальнейшей обработки?

что-то типа
Select *
From [хранимая_процедура(параметр1, параметр2)]
Into #TempTable

Спасибо,
17 мар 11, 11:25    [10384150]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
Xordal
Member

Откуда: Таганрог
Сообщений: 536
insert into @Table
  exec StoredProcedure p1, p2
17 мар 11, 11:33    [10384223]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
Ярослав Демин
Member

Откуда:
Сообщений: 161
Такое решение требует описание переменной @Table со всеми тремя-десятками полей...

Нет возможности избегнуть такой муки?
17 мар 11, 11:44    [10384317]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
Ярослав Демин,

-- Вариант 1, через openquery
-- если надо выполнить хранимку с этого же сервера, то сначала надо выполнить
exec sp_serveroption 'MyServer', 'data access', 'true'

-- Потом делаем select
select t.* from openquery(MyServer,'sp_who') as t


-- Если возникают ошибки, то можно по очереди, выполнять что-нибудь из этого
exec sp_serveroption 'MyServer', 'data access', 'true'
exec sp_serveroption 'MyServer', 'rpc','true'
exec master.dbo.sp_serveroption @server=N'MyServer', @optname=N'remote proc transaction promotion', @optvalue=N'false'

-- Также может помочь "set fmtonly off" (помогло, когда хранимая процедура имеет output-параметр)
select t.* from openquery(MyServer, 'set fmtonly off exec MyServer.test.sysdba.MyStoreProcedure [address], null') as t



-- Вариант 2, через openrowset
select * into #t from openrowset('SQLNCLI', 'Server=MyServer;Trusted_Connection=yes;', 'exec msdb.dbo.sp_help_job')
17 мар 11, 11:55    [10384420]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
Начинающий SQL 2008, что нужно указать вместо MyServer?
30 июн 11, 17:52    [10902102]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
analysts,

OPENQUERY ( linked_server , 'query' )
30 июн 11, 18:30    [10902352]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
analysts,
Как указал выше WarAnt, строка
select t.* from openquery(MyServer, 'set fmtonly off exec MyServer.test.sysdba.MyStoreProcedure [address], null') as t

правильнее будет так:
select t.* from openquery(LinkServer, 'set fmtonly off exec MyStoreProcedure [address], null') as t
1 июл 11, 10:24    [10904385]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
Glory
Member

Откуда:
Сообщений: 104751
Начинающий SQL 2008
правильнее будет так:
select t.* from openquery(LinkServer, 'set fmtonly off exec MyStoreProcedure [address], null') as t

А параметры то как в openquery будут переданы ?
При set fmtonly off процедура выполнится 2 раза, а если там есть занесение/изменение данных ?
1 июл 11, 10:28    [10904409]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
Ярослав Демин
Добрый день!

Есть старая SP, писанная не одним поколением с сотней некомментированных строк.
SP возвращает таблицу с тремядесятками полей.


Если надо использовать возвращаемый набор данных, то лучше один раз разобраться с сотней строк и преобразовать хп в функцию. Если в хп нет вставок/изменений/удалений строк в базовых таблицах и недетерминистических функций типа GetDate, то преобразовать в функцию можно простым копипастом. Но потребуется описать вручную все 30 полей :)
1 июл 11, 12:26    [10905343]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
В общем согласно варинту 2 выполняю следующую инструкцию, чтобы просмотреть результаты хранимки:
автор
select * into #t from openrowset('SQLNCLI', 'Server=comshare-tsum;Trusted_Connection=yes;', 'exec load_data.dbo.p_get_planstat_all @idplanversion=480')

Выдаём только то, что "(472630 row(s) affected)"
А как увидеть какие поля были выбраны?
7 июл 11, 16:48    [10940383]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
analysts,
select * from #t
?
7 июл 11, 16:49    [10940392]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
потом вообще говорит: "В базе данных уже существует объект с именем "#t".
А где его просмотреть?
7 июл 11, 16:54    [10940454]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
kDnZP,

да, помогает, но не понятно где эта таблица лежит?
7 июл 11, 16:55    [10940461]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
Начинающий SQL 2008
Member

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

if object_id('tempdb..#t') is not null drop table #t
7 июл 11, 16:56    [10940483]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
analysts, в tempdb еснно. Подробности о времени жизни - в BOL
7 июл 11, 16:57    [10940495]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
analysts,
еще на всякий случай запрос, для получения списка столбцов временной таблицы:

SELECT * FROM tempdb.sys.columns
WHERE object_id = OBJECT_ID('tempdb..#t')
7 июл 11, 17:00    [10940520]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
Всем большое спасибо!
А физически я могу временную таблицу в management studio увидеть или нет?
7 июл 11, 17:10    [10940611]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
Начинающий SQL 2008
Member

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

Картинка с другого сайта.
7 июл 11, 17:34    [10940795]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
странно, но у меня такой папки нет.
Видимо отсутствуют соответствующие права)
7 июл 11, 19:22    [10941373]     Ответить | Цитировать Сообщить модератору
 Re: Использовать RowSet, возвращаемый хранимой процедурой  [new]
analysts
Member

Откуда: Gardinas
Сообщений: 139
Разобрался. Все нормально видно.
Всем большое спасибо.
7 июл 11, 19:34    [10941423]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить