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

Откуда: Псков
Сообщений: 474
Имеется моя хранимая процедура с системной процедурой sp_helpuser (или что-нибудь подобное) выдающее в качестве результата таблицу
.................................................................
BEGIN
EXEC sp_helpuser
END

При вызове на выполнение хранимой процедуры, я эту таблицу прекрасно вижу. Однако, вопрос - где этот результат находится и могу ли я с ним продолжить работу ВНУТРИ хран. процедуры?
В частности, для этого примера столбцов таблицы семь, а мне нужно лишь два, то есть нужна вертикальная проекция того, что выдаёт EXEC sp_helpuser. Как это сделать - ума ни приложу! В Help-е по этому поводу ничего вразумительного не нашёл.

К сообщению приложен файл. Размер - 103Kb
18 янв 13, 17:38    [13793180]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Посмотрите, откуда процедура sp_helpuser берет данные.
18 янв 13, 17:40    [13793186]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
ValGer
Member

Откуда: Псков
Сообщений: 474
Гавриленко Сергей Алексеевич
Посмотрите, откуда процедура sp_helpuser берет данные.


И чем это может помочь?
18 янв 13, 17:45    [13793213]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
ValGer
Гавриленко Сергей Алексеевич
Посмотрите, откуда процедура sp_helpuser берет данные.


И чем это может помочь?
Тем, что можно написать нужный вам запрос (или свою процедуру) и не использовать sp_helpuser.

Есть вариант использовать, но он неудобный (см. INSERT ... EXEC ... )
18 янв 13, 17:47    [13793231]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
ValGer
Member

Откуда: Псков
Сообщений: 474
Вопрос не в helpuser. Как ОБОЙТИ эту проблему я могу предложить 33 разных способа. Вопрос в том, где находятся табличные результаты от EXEC и можно ли с ними работать далее ВНУТРИ хранимой процедуры (отбирать, сортировать и прочее...)?
18 янв 13, 17:58    [13793288]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
alexeyvg
Тем, что можно написать нужный вам запрос (или свою процедуру) и не использовать sp_helpuser.

Есть вариант использовать, но он неудобный (см. INSERT ... EXEC ... )


А других вариантов нет...
18 янв 13, 18:01    [13793308]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
ValGer
Вопрос в том, где находятся табличные результаты от EXEC

Во внутресерверном буфере обмена данными между сервером и клиентом
18 янв 13, 18:15    [13793347]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Гость333
Member

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

select UserName, LoginName
from openrowset('SQLNCLI', 'Server=(local);Trusted_Connection=yes;', 'set fmtonly off; exec sp_helpuser')

Правда, в этом незамысловатом коде разложено несколько различных граблей. Так что лучше использовать один из 33 известных вам способов обхода проблемы.
18 янв 13, 18:27    [13793403]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
.
Guest
Гость333,

...и при невключенном Ad Hoc Distributed Queries
и без прав ALTER SETTINGS, до граблей дело даже не дойдет ;)
18 янв 13, 18:54    [13793533]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
Гость333
Server=(local)

А если сервер не (local) ?
18 янв 13, 18:55    [13793537]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
ValGer
Вопрос в том, где находятся табличные результаты от EXEC и можно ли с ними работать далее ВНУТРИ хранимой процедуры (отбирать, сортировать и прочее...)?
Я же сказал, как использовать, совершенно стандартный вариант.

Просто он неудобный, лучше выдрать запросы.

Системные процедуры в сиквеле не предназначены для использования из кода на T-SQL, ничего не подулаешь :-(
18 янв 13, 21:02    [13794109]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
ValGer
И чем это может помочь?

Согласитесь, что вот из этого запроса куда проще убрать лишние столбцы чем из резалтсета процедуры
select  u.name
      , case when ( r.principal_id is null ) then 'public'
             else r.name
        end
      , l.name
      , l.default_database_name
      , u.default_schema_name
      , u.principal_id
      , u.sid
from    sys.database_principals u
        left join ( sys.database_role_members m
                    join sys.database_principals r on m.role_principal_id = r.principal_id
                  ) on m.member_principal_id = u.principal_id
        left join sys.server_principals l on u.sid = l.sid
where   u.type <> 'R'
18 янв 13, 22:01    [13794370]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
ValGer
Member

Откуда: Псков
Сообщений: 474
Ну, в общем понятно! Спасибо за дискуссию, буду использовать способ №18 из возможных 33-х. :-))
19 янв 13, 09:07    [13795575]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
создать временную таблицу, дублирующую структуру результирующего набора #temp
потом EXEC proc INTO #temp
потом работаешь с #temp
19 янв 13, 12:24    [13795772]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
Cygapb-007
создать временную таблицу, дублирующую структуру результирующего набора #temp
потом EXEC proc INTO #temp
потом работаешь с #temp
Про этот стандартный способ написали сразу, но он неудобен.

Например, всё это перестанет работать при изменении набора данных от процедуры.
19 янв 13, 21:56    [13797245]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Exproment
Member

Откуда:
Сообщений: 416
alexeyvg, полностью с вам согласен. Категорически нельзя записывать результаты exec'ов во временные таблицы! Такой код допустим только для разового исполнения, иначе вы станете слишком зависимы от сторонних разработчиков, в том числе от Microsoft'ских::)
19 янв 13, 22:34    [13797341]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Гость333
Member

Откуда:
Сообщений: 3683
.
Гость333,

...и при невключенном Ad Hoc Distributed Queries
и без прав ALTER SETTINGS, до граблей дело даже не дойдет ;)

Ну смотря что считать граблями -- к примеру, пусть на тестовом сервере эта настройка оказалась включена, с ней отладились, перенесли функционал на продуктив -- а там настройка выключена. Упс.

Glory
Гость333
Server=(local)

А если сервер не (local) ?

... и если (local) существует, и на него есть права? Вроде и результат получили, да только какой-то не такой :-)

Exproment
Категорически нельзя записывать результаты exec'ов во временные таблицы!

А что с этими результатами нужно делать?
20 янв 13, 01:46    [13797719]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
MMM_Corp
Member

Откуда: Тернопіль, Україна
Сообщений: 2102
можно и проще...
см. http://msdn.microsoft.com/ru-ru/library/ms188927.aspx

declare as table...
20 янв 13, 15:13    [13798445]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
MMM_Corp
можно и проще...
см. http://msdn.microsoft.com/ru-ru/library/ms188927.aspx

declare as table...
А как таким способом получить данные из системной процедуры sp_helpuser???
20 янв 13, 17:22    [13798764]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
alexeyvg
MMM_Corp
можно и проще...
см. http://msdn.microsoft.com/ru-ru/library/ms188927.aspx

declare as table...
А как таким способом получить данные из системной процедуры sp_helpuser???
предварительно объявив таблицу соответствующей ХП структуры:)
declare @tbl TABLE(...)
insert into @tbl exec ХП
20 янв 13, 22:51    [13799713]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
Cygapb-007
предварительно объявив таблицу соответствующей ХП структуры:)
А, я думал, это вы про табличные параметры, а вы просто повторили свой предыдущий пост 13795772 :-)
20 янв 13, 23:48    [13799928]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
alexeyvg
Cygapb-007
предварительно объявив таблицу соответствующей ХП структуры:)
А, я думал, это вы про табличные параметры, а вы просто повторили свой предыдущий пост 13795772 :-)
это не я предложил. просто пояснил
21 янв 13, 00:53    [13800105]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
Cygapb-007
просто пояснил
А, извиняюсь, это MMM_Corp повторил то, что уже несколько раз предлагали :-)
21 янв 13, 00:57    [13800113]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
не совсем так, объявление @table вроде как решает кучу проблем, возникающих при #table - речь шла об этом
21 янв 13, 00:59    [13800118]     Ответить | Цитировать Сообщить модератору
 Re: Табличные данные в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
Cygapb-007
не совсем так, объявление @table вроде как решает кучу проблем, возникающих при #table - речь шла об этом
Какие проблемы решает?

По сути проблемы три:
1. При изменении набора данных от процедуры всё перестаёт работать.
2. Полученную в результате процедуру нельзя вызвать таким способом ещё раз, т.е. количество вложенных insert into ... exec ... равно 1.
3. Код всегда будет перекомпилироваться

Рахве что третью проблему решит, но не уверен...
21 янв 13, 09:07    [13800537]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить