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

Откуда:
Сообщений: 2
Нужно получить XML в таком виде:

<DATAPACKET>
<ROWDATA>
<ROW NAME="Имя1" AR_DS_ID="4" />
<ROW NAME="Имя2" AR_DS_ID="5" />
<ROW NAME="Имя3" AR_DS_ID="43" />
<ROW NAME="Имя4" AR_DS_ID="44"/>
</ROWDATA>
</DATAPACKET>



вот запрос.

SELECT
[NAME],
AR_DS_ID
FROM App_Repl_Database_Servers
FOR XML RAW('ROW'),ROOT('DATAPACKET')

вот что, получается

<DATAPACKET>
<ROW NAME="Имя1" AR_DS_ID="4" />
<ROW NAME="Имя2" AR_DS_ID="5" />
<ROW NAME="Имя3" AR_DS_ID="43" />
<ROW NAME="Имя4" AR_DS_ID="44"/>
</DATAPACKET>

Подскажите, пожалуйста, как добавить еще одну вложенность?
28 дек 09, 12:54    [8126577]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML - как добавить вложенность?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

например:
select
   (
   SELECT
     [NAME],
     AR_DS_ID
   FROM App_Repl_Database_Servers
   FOR XML RAW('ROW'),ROOT('ROWDATA'), type
   ) [node()]
for xml path('DATAPACKET')

Posted via ActualForum NNTP Server 1.4

28 дек 09, 13:28    [8126869]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML - как добавить вложенность?  [new]
S_D_N_sql
Member

Откуда:
Сообщений: 2
daw, Спасибо! то, что надо!
28 дек 09, 13:31    [8126890]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML - как добавить вложенность?  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 598
daw

например:
select
   (
   SELECT
     [NAME],
     AR_DS_ID
   FROM App_Repl_Database_Servers
   FOR XML RAW('ROW'),ROOT('ROWDATA'), type
   ) [node()]
for xml path('DATAPACKET')



а если необходимо результат двух разных запросов, это возможно?

например


SELECT
[NAME]
FROM t1
FOR XML RAW('ROW'),ROOT('ROWDATA')

SELECT
[NAME]
FROM t2
FOR XML RAW('ROW'),ROOT('ROWDATA')

а DATAPACKET окрывал и закрывал результат выполнения обоих запросов, так возможно?
28 дек 09, 14:52    [8127466]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML - как добавить вложенность?  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 598
Andrey Sribnyak,

<DATAPACKET>
<T1>
<ROW NAME="Имя1" />
</T1>
<T2>
<ROW NAME="Имя2" />
</T2>
</DATAPACKET>


Как-то так
28 дек 09, 14:54    [8127482]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML - как добавить вложенность?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> а если необходимо результат двух разных запросов, это возможно?

?
select
   (
    select
      object_id, name
    from sys.objects
    where name like 'sysc%'
    for xml raw('row'), root('rowdata_sysc'), type) [node()]
,
  (
   select
     object_id, name
   from sys.objects
   where name like 'sysr%'
   for xml raw('row'), root('rowdata_sysr'), type) [node()]
for xml path(''), root('datapacket')

Posted via ActualForum NNTP Server 1.4

28 дек 09, 15:01    [8127532]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML - как добавить вложенность?  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 598
daw,

Да, так и хотелось. Спасибо!
28 дек 09, 15:33    [8127818]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML - как добавить вложенность?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Delphi? ClientDataSet XML?
По аналогии с этим.
CREATE FUNCTION [dbo].[fnDelphiXMLQuery] (
	 @Object	SysName
	,@Query		NVarChar(max)
) RETURNS NVarChar(max) AS BEGIN RETURN ( SELECT
	'SELECT(SELECT ' + (
SELECT	 CASE WHEN Row_Number()OVER(ORDER BY column_id) != 1 THEN ',' END
	,CASE WHEN system_type_id = 104 THEN 'CASE ' + QuoteName(name) + ' WHEN 0 THEN ''False'' WHEN 1 THEN ''True'' END ' END
	,QuoteName(name)
FROM	sys.columns
WHERE	[Object_ID] = Object_ID(@Object)
ORDER BY column_id
FOR XML PATH(''), TYPE).value('.','NVarChar(max)')
	+ ' FROM ' + @Object + ' AS ROW ' +  @Query + ' FOR XML AUTO, BINARY BASE64, TYPE).query('''
	+ Convert(NVarChar(max),(
SELECT	 [name]			AS attrname
	,CASE	system_type_id
		WHEN  34	THEN 'bin.hex'
		WHEN  35	THEN 'bin.hex'
		WHEN  36	THEN 'string'
		WHEN  48	THEN 'i2'
		WHEN  52	THEN 'i2'
		WHEN  56	THEN 'i4'
		WHEN  58	THEN 'dateTime'
		WHEN  59	THEN 'r8'
		WHEN  60	THEN 'fixed'
		WHEN  61	THEN 'dateTime'
		WHEN  62	THEN 'r8'
		WHEN  99	THEN 'bin.hex'
		WHEN 104	THEN 'boolean'
		WHEN 106	THEN 'fixed'
		WHEN 108	THEN 'fixed'
		WHEN 122	THEN 'fixed'
		WHEN 127	THEN 'i8'
		WHEN 165	THEN 'bin.hex'
		WHEN 167	THEN IsNull([bin.hex],'string')
		WHEN 173	THEN 'bin.hex'
		WHEN 175	THEN 'string'
		WHEN 189	THEN 'bin.hex'
		WHEN 231	THEN IsNull([bin.hex],'string.uni')
		WHEN 239	THEN 'string.uni'
		WHEN 241	THEN 'bin.hex'
		END		AS fieldtype
	,CASE	system_type_id
		WHEN  60	THEN 4
		WHEN 106	THEN scale
		WHEN 108	THEN scale
		WHEN 122	THEN 4
		END		AS DECIMALS
	,CASE	system_type_id
		WHEN  36	THEN 36
		WHEN  60	THEN 19
		WHEN 106	THEN [precision]
		WHEN 108	THEN [precision]
		WHEN 122	THEN 10
		WHEN 165	THEN NullIf(max_length,-1)
		WHEN 167	THEN NullIf(max_length,-1)
		WHEN 173	THEN NullIf(max_length,-1)
		WHEN 175	THEN max_length
		WHEN 189	THEN 16
		WHEN 231	THEN NullIf(max_length,-1)
		WHEN 239	THEN max_length
		END		AS WIDTH
	,CASE	system_type_id
		WHEN  34	THEN 'Binary'
		WHEN  35	THEN 'Text'
		WHEN  36	THEN 'FixedChar'
		WHEN  99	THEN 'Text'
		WHEN 165	THEN [Binary]
		WHEN 167	THEN [Text]
		WHEN 173	THEN [Binary]
		WHEN 175	THEN 'FixedChar'
		WHEN 231	THEN [Text]
		WHEN 239	THEN 'FixedChar'
		WHEN 241	THEN 'Text'
		END		AS SUBTYPE
FROM	sys.columns	AS FIELD
	OUTER APPLY (
	SELECT	 Convert(VarChar,'bin.hex') [bin.hex]
		,Convert(VarChar,'Binary' ) [Binary]
		,Convert(VarChar,'Text'   ) [Text]
	WHERE	max_length = -1	) X
WHERE	[Object_ID] = Object_ID(@Object)
FOR XML AUTO, TYPE).query('<DATAPACKET Version="2.0">
 <METADATA>
  <FIELDS>
   {.}
  </FIELDS>
  <PARAMS />
 </METADATA>
 <ROWDATA>&#123;&#46;&#125;</ROWDATA>
</DATAPACKET>')) + ''')'
) END
GO
Юзать можно так:
DECLARE @Query NVarChar(max)
SET @Query = dbo.fnDelphiXMLQuery('<Table/View/Function>','[(Function params)] WHERE <Filter>')
EXEC(@Query)
Andrey Sribnyak
а если необходимо результат двух разных запросов, это возможно?
A UNION ALL не катит?
30 дек 09, 10:42    [8136060]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML - как добавить вложенность?  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 598
Mnior

UNION ALL не катит?


Не совсем, когда таблицы разной структуры. А так вышло универсальное решение по выгрузке разных таблиц в один xml файл
30 дек 09, 15:45    [8138142]     Ответить | Цитировать Сообщить модератору
 Re: FOR XML - как добавить вложенность?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Andrey Sribnyak,
Угу, а /DATAPACKET /ROWDATA /ROW это чисто совпадение.
30 дек 09, 19:25    [8139137]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить