Выберите строки, преобразованные в xml - PullRequest
0 голосов
/ 18 июня 2020

Я хочу объединить несколько таблиц в один запрос в один столбец для последующей десериализации, и я могу сделать это, используя xml:

SELECT (SELECT * FROM table as B WHERE B.Id = A.Id FOR XML) as Serialized FROM table as A 

И это даст некоторый сериализованный столбец со всей строкой сериализован в него. Очевидно, есть проблема подзапроса - надо поставить этот надоедливый подзапрос WHERE и не просто Id=Id, а определить первичный индекс и добавить соответствующие поля:

SELECT (SELECT * FROM manyToManyTable as B WHERE B.SourceId = A.SourceId AND B.TargetId = A.TargetId FOR XML) as Serialized FROM manyToManyTable as A 

И станет хуже для системы -версированные таблицы, потому что он добавит собственный дополнительный индекс. Есть ли способ сказать просто:

SELECT /* row as xml*/ FROM manyToManyTable 

или:

SELECT (SELECT * FROM SAME_ROW() FOR XML) as Serialized FROM manyToManyTable 

, не углубляясь в схему таблицы?

1 Ответ

1 голос
/ 19 июня 2020

Возможно, вы ищете FOR XML PATH в OUTER APPLY, например:

create table [dbo].[Table] (
  Id int not null,
  Value nvarchar(50)
);
insert [dbo].[Table] values
  (1, N'Alpha'),
  (2, N'Bravo'),
  (3, N'Charlie');

Где:

SELECT Serialized
FROM [dbo].[Table]
OUTER APPLY (SELECT [Table].* FOR XML PATH) xmlColumns (Serialized)

Результаты:

Serialized
----------
<row><Id>1</Id><Value>Alpha</Value></row>
<row><Id>2</Id><Value>Bravo</Value></row>
<row><Id>3</Id><Value>Charlie</Value></row>

Или, если вам не нравятся имена элементов <row>, укажите свои собственные:

SELECT Serialized
FROM [dbo].[Table]
OUTER APPLY (SELECT [Table].* FOR XML PATH('Foo')) xmlColumns (Serialized)

Результат:

Serialized
----------
<Foo><Id>1</Id><Value>Alpha</Value></Foo>
<Foo><Id>2</Id><Value>Bravo</Value></Foo>
<Foo><Id>3</Id><Value>Charlie</Value></Foo>
...