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

Откуда:
Сообщений: 1214
Имеем
DECLARE @Table TABLE ([ObjectName] NVarchar(256), [ParName] varchar(255), [ParValue] SQL_Variant) 
INSERT INTO @Table VALUES ('Object1','Date',CAST('20130501' AS Datetime)) 
INSERT INTO @Table VALUES ('Object1','Flag',CAST(1 AS Bit)) 
INSERT INTO @Table VALUES ('Object1','Description',CAST('Object description' AS varchar(300))) 
INSERT INTO @Table VALUES ('Object2','Filter',CAST(' AND 1 = 1 ' AS Varchar(30))) 
 
SELECT 
  ST.[ObjectName], 
  CAST(CA.XMLparam AS XML) 
FROM @Table ST CROSS APPLY ( 
               SELECT PAR.[ParName], PAR.[ParValue]
               FROM @Table PAR  
               WHERE PAR.[ObjectName] = ST.[ObjectName]  FOR XML AUTO  /*<-- ????*/ 
               ) CA (XMLparam)
  


Нужно
Name    | XMLPAram
-------------------------------------------------------------------------------------------------------------------
Object1 | <Params ObjectName = "Object1"><Date>"20130501"</Date><Flag>"1"</Flag><Description>"Object description"</Descriptionn></Params>
Object2 | <Params ObjectName = "Object2"><Filter>" AND 1 = 1 "</Filter></Params> 
24 май 13, 10:03    [14342828]     Ответить | Цитировать Сообщить модератору
 Re: Как получить XML заданного формата?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
SELECT 
  ST.[ObjectName], 
  CA.XMLparam
FROM (select distinct ObjectName from @Table) ST CROSS APPLY ( 
               SELECT 
                 PAR.ObjectName as [@ObjectName]
                 , max(case when PAR.ParName = 'Date' then PAR.ParValue end) as [Date]
                 , max(case when PAR.ParName = 'Flag' then PAR.ParValue end) as [Flag]
                 , max(case when PAR.ParName = 'Description' then PAR.ParValue end) as [Description]
                 , max(case when PAR.ParName = 'Filter' then PAR.ParValue end) as [Filter]
               FROM @Table PAR  
               WHERE PAR.[ObjectName] = ST.[ObjectName]
               group by PAR.ObjectName  
               FOR XML path('Params'), type
               
               ) CA (XMLparam)


предвидя вопрос "а если перечень ParName заранее неизвестен?" - тогда формировать запрос динамически.
24 май 13, 10:25    [14343036]     Ответить | Цитировать Сообщить модератору
 Re: Как получить XML заданного формата?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Спасибо, но как-то оно неоче. Эксемель от пивота.. да еще динамически. Брррр
24 май 13, 10:34    [14343101]     Ответить | Цитировать Сообщить модератору
 Re: Как получить XML заданного формата?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Cammomile
да еще динамически

Ну так вы имена тегов храните в полях - как же их еще достать не динамически ?
24 май 13, 10:36    [14343116]     Ответить | Цитировать Сообщить модератору
 Re: Как получить XML заданного формата?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А я магией XML не владею. Я предположил, что есть какие-о особые методы указать кто тут элемент, а кто значение.
24 май 13, 10:40    [14343142]     Ответить | Цитировать Сообщить модератору
 Re: Как получить XML заданного формата?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Cammomile
А я магией XML не владею. Я предположил, что есть какие-о особые методы указать кто тут элемент, а кто значение.

Есть - написать код, подобный предложенному. Он именно и ""указывает кто тут элемент, а кто значение"
24 май 13, 10:46    [14343187]     Ответить | Цитировать Сообщить модератору
 Re: Как получить XML заданного формата?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
DECLARE @Table TABLE ([ObjectName] NVarchar(256), [ParName] varchar(255), [ParValue] SQL_Variant) 
INSERT INTO @Table VALUES ('Object1','Date',CAST('20130501' AS Datetime)) 
INSERT INTO @Table VALUES ('Object1','Flag',CAST(1 AS Bit)) 
INSERT INTO @Table VALUES ('Object1','Description',CAST('Object description' AS varchar(300))) 
INSERT INTO @Table VALUES ('Object2','Filter',CAST(' AND 1 = 1 ' AS Varchar(30))) 

;WITH Buff(ObjectName,XMLDATA,ParName,Step) AS
(SELECT distinct [ObjectName],cast('<Params ObjectName = "'+[ObjectName]+'">'  as varchar(max)),cast('' as varchar(255)), 1 FROM @Table
UNION ALL 
SELECT b.ObjectName
,b.XMLDATA+cast('<'+t.ParName+'>'+CAST(t.ParValue as varchar(100))+'</'+t.ParName+'>' as varchar(max))
,t.ParName,b.Step+1
FROM @Table t
JOIN Buff b ON b.ObjectName = t.ObjectName
AND t.ParName > b.ParName
AND not exists(select * from @Table t1 where t1.ObjectName=t.ObjectName and t1.ParName > b.ParName and t1.ParName<t.ParName)
) 
select top 1 with ties ObjectName,CAST(XMLDATA +'</Params>' as XML) as XMLDATA
from  Buff
order by ROW_NUMBER()over(partition by ObjectName order by Step desc)
24 май 13, 15:01    [14345509]     Ответить | Цитировать Сообщить модератору
 Re: Как получить XML заданного формата?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Так ок, благодарю!
24 май 13, 15:06    [14345544]     Ответить | Цитировать Сообщить модератору
 Re: Как получить XML заданного формата?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Так ок, благодарю!

только имейте в виду - при таком способе исходные данные надо предварительно проверять:
INSERT INTO @Table VALUES ('Object1','Description',CAST('Object & description' AS varchar(300)))
INSERT INTO @Table VALUES ('Object1','Description',CAST('Object < description' AS varchar(300)))

а уж ParName, которые становятся именами тегов - так и подавно.
24 май 13, 15:29    [14345714]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить