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

Откуда: Тверь
Сообщений: 882
Привет! (SQL SERVER 2014)
Есть несколько процедур (около 100), результат выполнения которых нужно получить в виде XML.
В голову приходят несколько вариантов.
Первое. Пишем для каждой процедуры оберточную процедуру, где результат записываем в XML.(простой но много писанины)
Второе. Пишем одну, где по имени процедуры динамически формируем SQL, в котором получаем все опять же в виде XML.

Какой вариант предпочтительнее или может еще есть какие-то варианты?
19 июн 15, 15:06    [17793191]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
PG81
Есть несколько процедур (около 100), результат выполнения которых нужно получить в виде XML.

А сейчас результат в каком виде ?

PG81
Первое. Пишем для каждой процедуры оберточную процедуру, где результат записываем в XML.(простой но много писанины)

И как будет выглядеть это "результат процедуры записываем в XML" ?
19 июн 15, 15:11    [17793223]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
PG81
Member

Откуда: Тверь
Сообщений: 882
Glory,

Сейчас результат такой
create proc dbo.ClientList@ID int as
begin
  select 
    C.ID
    C.Name
    C.Phone
    C.Email
  from Client C
end



а нужно получить его в переменной
declare @ResultXML xml,
19 июн 15, 15:18    [17793282]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
PG81
Сейчас результат такой
create proc dbo.ClientList@ID int as
begin
  select 
    C.ID
    C.Name
    C.Phone
    C.Email
  from Client C
end




а нужно получить его в переменной
declare @ResultXML xml,

Не переписываю процедуру что ли получить ?
19 июн 15, 15:19    [17793293]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
PG81
Member

Откуда: Тверь
Сообщений: 882
Glory,

да, исходные процедуры переписывать нельзя
19 июн 15, 15:22    [17793314]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
PG81
да, исходные процедуры переписывать нельзя

И как вы собираетесь перехватить результат запроса ?
19 июн 15, 15:23    [17793321]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
Валдай
Member

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

если можете сделать линкед сервер смотрящий на самого, тогда можно так

set @xml =
(
select *
from openquery (linkedserver, 'exec proc ...')
for xml... , type )
19 июн 15, 15:29    [17793380]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
Валдай
если можете сделать линкед сервер смотрящий на самого, тогда можно так

Ага. Только параметры не передашь ни разу
19 июн 15, 15:30    [17793392]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
PG81
Member

Откуда: Тверь
Сообщений: 882
Glory,

в каком случае в первом или во втором?
(ну в принципе там и там одинаково)
только во втором это происходит динамически.
Создается временная таблица с полями, которые возвращает процедура
а потом выполняется запрос типа
insert into @Tab(ID,Name,Phone,Email)
exec dbo.ClientList
19 июн 15, 15:34    [17793436]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
PG81
в каком случае в первом или во втором?

Во всех

PG81
Создается временная таблица с полями, которые возвращает процедура

Тогда нет никакой разницы
19 июн 15, 15:36    [17793459]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
Валдай
Member

Откуда:
Сообщений: 113
Glory
Валдай
если можете сделать линкед сервер смотрящий на самого, тогда можно так

Ага. Только параметры не передашь ни разу


Ну, великий и ужасный динамический sql в помощь, для 2го варианта топистартера подходит
19 июн 15, 15:37    [17793468]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
PG81
Member

Откуда: Тверь
Сообщений: 882
Валдай,

ну я и хотел использовать второй вариант, но подумал, вдруг есть еще какой вариант по проще
19 июн 15, 15:39    [17793489]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
Валдай
Glory
пропущено...

Ага. Только параметры не передашь ни разу


Ну, великий и ужасный динамический sql в помощь, для 2го варианта топистартера подходит

При мало-мальски сложной процедуре ничто не поможет избавиться от невозможности получить метаданные о результате
19 июн 15, 15:39    [17793491]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
Валдай
Member

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

А вы чего делать с этими данными собираетесь?
Единственно что мне на ум приходит - регрессионное тестирование...
но универсально не получится все сделать, если есть процы, которые несколько рекорсетов вовращают, то как их сохранять планируете? А если для разных наборов параметров разные рекордсеты? А если вообще ничего не вернут?
19 июн 15, 15:44    [17793544]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
Владислав Колосов
Member

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

пусть клиент форматирует эти запросы хоть в XML хоть в XLS.
19 июн 15, 15:54    [17793644]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
PG81
Member

Откуда: Тверь
Сообщений: 882
Валдай,

нескольких рекордсетов нигде нет и непланируется в будущем
поэтому такой проблемы нет

Владислав Колосов,
на клиенте ничего делаться не будет это точно
19 июн 15, 16:50    [17794034]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
PG81
Member

Откуда: Тверь
Сообщений: 882
Владислав Колосов,

вернее я хотел сказать, с клиентом не подходит.

А чем плох динамический вариант?
sp_describe_first_result_set
возвращает все что нужно для создания XML
19 июн 15, 16:52    [17794041]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
USE tempdb
GO 

CREATE PROCEDURE x AS

SELECT GETDATE() AS A
GO 

EXEC x
GO 

DECLARE @T TABLE (A DATETIME) 

INSERT INTO @T 
EXEC X


SELECT * FROM @T FOR XML PATH

GO 
DROP PROCEDURE x 
19 июн 15, 19:32    [17794777]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
eny
Member

Откуда: москва
Сообщений: 292
Ну дык, начитываем код процедуры и генерим процедуру обертку с временной таблицей и переводом в хмл
В курсоре за час получим сто новых процедур. Код курсора - подумать день и вспомнить про метаданные
19 июн 15, 20:56    [17795060]     Ответить | Цитировать Сообщить модератору
 Re: Как получить результат любой процедуры в XML  [new]
ЦБ
Member [заблокирован]

Откуда:
Сообщений: 2773
PG81
вернее я хотел сказать, с клиентом не подходит.
Почему не подходит?
Никто ж не предлагает в конкретно вашем "клиенте" добавлять эту фишку.
Речь про то, что бы сделать, например, VBS-скрипт, который подключится к БД, "пройдётся" по всей коллекции процедур, выполнит их и выгрузит результаты в файлы или запишет в какую-то табличку.
Т.е. не делать это в серверном батче.

Хотя при желании, можно и в батче
use tempdb
go

create proc dbo.x
as
select getdate() as dt_fld, 1 as int_fld, 'a' as txt_fld
union all
select getdate() as dt_fld, 2 as int_fld, 'b' as txt_fld
go

-- ************************
declare @hr int
declare @cn int
declare @ConnStr varchar(255) 
declare @rs int
declare @sql varchar(255) 
declare @xmldom int

declare @t table(proc_xml_data xml)

--
set @ConnStr = 'PROVIDER=SQLOLEDB.1;INTEGRATED SECURITY=SSPI;PERSIST SECURITY INFO=FALSE;INITIAL CATALOG=tempdb;DATA SOURCE=(local)'
--
exec @hr = sp_OACreate 'ADODB.Connection', @cn out

exec @hr = sp_OASetProperty @cn, 'ConnectionString', @ConnStr
exec @hr = sp_OAMethod @cn, 'Open'

set @sql = 'exec dbo.x' 
exec @hr = sp_OACreate 'ADODB.Recordset', @rs out
exec @hr = sp_OAMethod @rs, 'Open', null, @sql, @cn

exec @hr = sp_OACreate 'MSXML2.DOMDocument', @xmldom out
exec @hr = sp_OASetProperty @xmldom, 'async', 0
exec @hr = sp_OAMethod @rs, 'Save', null, @xmldom out, 1
--exec @hr = sp_OAMethod @rs, 'Save', null, 'C:\Temp\x.xml', 1

insert into @t (proc_xml_data)
exec @hr = sp_OAGetProperty @xmldom, 'xml' 
----
select * from @t

--
exec @hr = sp_OAMethod @rs, 'Close'
exec @hr = sp_OAMethod @cn, 'Close'
--
exec @hr = sp_OADestroy @xmldom
exec @hr = sp_OADestroy @rs
exec @hr = sp_OADestroy @cn
-- ************************
go

drop proc dbo.x
go

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
  <s:Schema id="RowsetSchema">
    <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
      <s:AttributeType name="dt_fld" rs:number="1">
        <s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="3" rs:precision="23" rs:fixedlength="true" rs:maybenull="false" />
      </s:AttributeType>
      <s:AttributeType name="int_fld" rs:number="2">
        <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" rs:fixedlength="true" rs:maybenull="false" />
      </s:AttributeType>
      <s:AttributeType name="txt_fld" rs:number="3">
        <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="1" rs:maybenull="false" />
      </s:AttributeType>
      <s:extends type="rs:rowbase" />
    </s:ElementType>
  </s:Schema>
  <rs:data>
    <z:row dt_fld="2015-06-20T09:38:18.280000000" int_fld="1" txt_fld="a" />
    <z:row dt_fld="2015-06-20T09:38:18.280000000" int_fld="2" txt_fld="b" />
  </rs:data>
</xml>
20 июн 15, 09:36    [17796369]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить