В основном мне нужно выводить из базы данных как поля с одним значением, так и поля с несколькими значениями. Большинство пользователей данных не являются техническими специалистами, и было бы неплохо, если бы они могли прочитать XML и понять его смысл. С помощью другого сообщения я почти дошел до конца.
Проблема заключается в том, что в имени элемента не может быть пробелов. Нужно включить отображаемое имя, которое может содержать пробелы. Например, MVtext displayName="Multi Value Text". Если правильным ответом будет встроенная схема или другой подход, пожалуйста, дайте мне знать. Я не могу опубликовать статическую схему, так как приложение может динамически добавлять поля. И поля могут меняться в зависимости от типа отчета. Поля находятся в таблице, и я читаю эту таблицу, чтобы построить select.
Как я могу передать отображаемое имя, которое может содержать пробелы для элементов? SQL 2008 R2.
SELECT top 4
[sv].[sID] AS '@sID'
,[sv].[sParID] AS '@sParID'
,[sv].[docID] AS 'docID'
,[sv].addDate as 'addDate'
,(SELECT [value] AS 'value'
FROM [docMVtext] as [mv]
WHERE [mv].[sID] = [sv].[sID]
AND [mv].[fieldID] = '113'
ORDER BY [mv].[value]
FOR XML PATH (''), type
) AS "To"
,(SELECT [value] AS 'value'
FROM [docMVtext] as [mv]
WHERE [mv].[sID] = [sv].[sID]
AND [mv].[fieldID] = '130'
ORDER BY [mv].[value]
FOR XML PATH (''), type
) AS "MVtest"
FROM [docSVsys] as [sv]
WHERE [sv].[sID] >= '57'
ORDER BY
[sv].[sParID], [sv].[sID]
FOR XML PATH('Document'), root('Documents')
Выдает:
<Documents>
<Document sID="57" sParID="57">
<docID>3.818919.C41P3UKK00BRICLAY0AR1ET2EBPYSU4SA</docID>
<addDate>2011-10-28T12:26:00</addDate>
<To>
<value>Frank Ermis</value>
<value>Keith Holst</value>
<value>Mike Grigsby</value>
</To>
<MVtest>
<value>MV test 01</value>
<value>MV test 02</value>
<value>MV test 03</value>
<value>MV test 04</value>
</MVtest>
</Document>
<Document sID="58" sParID="57">
<docID>3.818919.C41P3UKK00BRICLAY0AR1ET2EBPYSU4SA.1</docID>
<addDate>2011-10-28T12:26:00</addDate>
</Document>
<Document sID="59" sParID="59">
<docID>3.818920.KJKP5LYKTNIODOEI4JDOKJ2BXJI5P0BIA</docID>
<addDate>2011-10-28T12:26:00</addDate>
<To>
<value>Vladimir Gorny</value>
</To>
</Document>
<Document sID="60" sParID="59">
<docID>3.818920.KJKP5LYKTNIODOEI4JDOKJ2BXJI5P0BIA.1</docID>
<addDate>2011-10-28T12:26:00</addDate>
</Document>
</Documents>
Я устал
SELECT [value] AS 'value', 'MV test' as 'dispName'
Но получаю
<MVtest>
<value>MV test 01</value>
<dispName>MV test</dispName>
<value>MV test 02</value>
<dispName>MV test</dispName>
<value>MV test 03</value>
<dispName>MV test</dispName>
<value>MV test 04</value>
<dispName>MV test</dispName>
</MVtest>
SELECT [value] AS 'value', 'MV test' as '@dispName' Выбрасывает ошибку выполнения Row tag omission (empty row tag name) cannot be used with attribute-centric FOR XML serialization
Желаемый результат:
<Documents>
<Document sID="57" sParID="57">
<docID>3.818919.C41P3UKK00BRICLAY0AR1ET2EBPYSU4SA</docID>
<addDate>2011-10-28T12:26:00</addDate>
<To>
<value>Frank Ermis</value>
<value>Keith Holst</value>
<value>Mike Grigsby</value>
</To>
<MVtest dispName="Multi Value Text">
<value>MV test 01</value>
<value>MV test 02</value>
<value>MV test 03</value>
<value>MV test 04</value>
</MVtest>
</Document>
</Documents>
Решение:
SELECT top 4
[sv].[sID] AS '@sID'
,[sv].[sParID] AS '@sParID'
,'SV' as 'docID/@SVMV'
,[sv].[docID] AS 'docID'
,'SV' as 'addDate/@SVMV'
,[sv].addDate as 'addDate'
,'Email To' as 'To/@DisplayName'
,'MV' as 'To/@SVMV'
,(SELECT [value] AS 'value'
FROM [docMVtext] as [mv]
WHERE [mv].[sID] = [sv].[sID]
AND [mv].[fieldID] = '113'
ORDER BY [mv].[value]
FOR XML PATH (''), type
) AS "To"
,'Multi Value Text Sample' as 'MVtext130/@DisplayName'
,'MV' as 'MVtext130/@SVMV'
,(SELECT [value] AS 'value'
FROM [docMVtext] as [mv]
WHERE [mv].[sID] = [sv].[sID]
AND [mv].[fieldID] = '130'
ORDER BY [mv].[value]
FOR XML PATH (''), type
) AS "MVtext130"
FROM [docSVsys] as [sv]
WHERE [sv].[sID] >= '57'
ORDER BY [sv].[sParID], [sv].[sID]
FOR XML PATH('Document'), root('Documents')
Вывод решения:
<Documents>
<Document sID="57" sParID="57">
<docID SVMV="SV">3.818919.C41P3UKK00BRICLAY0AR1ET2EBPYSU4SA</docID>
<addDate SVMV="SV">2011-10-28T12:26:00</addDate>
<To DisplayName="Email To" SVMV="MV">
<value>Frank Ermis</value>
<value>Keith Holst</value>
<value>Mike Grigsby</value>
</To>
<MVtext130 DisplayName="Multi Value Text Sample" SVMV="MV">
<value>MV test 01</value>
<value>MV test 02</value>
<value>MV test 03</value>
<value>MV test 04</value>
</MVtext130>
</Document>
<Document sID="58" sParID="57">
<docID SVMV="SV">3.818919.C41P3UKK00BRICLAY0AR1ET2EBPYSU4SA.1</docID>
<addDate SVMV="SV">2011-10-28T12:26:00</addDate>
<To DisplayName="Email To" SVMV="MV" />
<MVtext130 DisplayName="Multi Value Text Sample" SVMV="MV" />
</Document>
<Document sID="59" sParID="59">
<docID SVMV="SV">3.818920.KJKP5LYKTNIODOEI4JDOKJ2BXJI5P0BIA</docID>
<addDate SVMV="SV">2011-10-28T12:26:00</addDate>
<To DisplayName="Email To" SVMV="MV">
<value>Vladimir Gorny</value>
</To>
<MVtext130 DisplayName="Multi Value Text Sample" SVMV="MV" />
</Document>
<Document sID="60" sParID="59">
<docID SVMV="SV">3.818920.KJKP5LYKTNIODOEI4JDOKJ2BXJI5P0BIA.1</docID>
<addDate SVMV="SV">2011-10-28T12:26:00</addDate>
<To DisplayName="Email To" SVMV="MV" />
<MVtext130 DisplayName="Multi Value Text Sample" SVMV="MV" />
</Document>
</Documents>
Это отличное решение моего вопроса. Единственным симптомом добавления атрибута является то, что я получаю элемент, даже если есть строки с нулевыми значениями. В идеале, если нет значений, то элемент не выводится.
Попробовал оператор Case, но даже если я устанавливаю значение '', элемент отображается.
,[MVtext130/@DisplayName] =
Case (select COUNT(*) FROM [docMVtext]
WHERE [docMVtext].[sID] = [sv].[sID]
AND [docMVtext].[fieldID] = '130')
when '0' then ''
else 'Multi Value Text Sample'
end
Обновил решение, чтобы не выводить элемент без значений:
SELECT top 4
[sv].[sID] AS '@sID'
,[sv].[sParID] AS '@sParID'
,'SV' as 'docID/@SVMV'
,[sv].[docID] AS 'docID'
,'SV' as 'addDate/@SVMV'
,[sv].addDate as 'addDate'
,(select top(1) 'Email To'
from [docMVtext] as C
where C.[sID] = [sv].[sID] and c.fieldID = '113' ) as 'To/@DisplayName'
,(select top(1) 'MV'
from [docMVtext] as C
where C.[sID] = [sv].[sID] and c.fieldID = '113' ) as 'To/@SVMV'
--,'Email To' as 'To/@DisplayName'
--,'MV' as 'To/@SVMV'
,(SELECT [value] AS 'value'
FROM [docMVtext] as [mv]
WHERE [mv].[sID] = [sv].[sID]
AND [mv].[fieldID] = '113'
ORDER BY [mv].[value]
FOR XML PATH (''), type
) AS "To"
,(select top(1) 'Multi Value Text Sample'
from [docMVtext] as C
where C.[sID] = [sv].[sID] and c.fieldID = '130' ) as 'MVtext130/@DisplayName'
,(select top(1) 'MV'
from [docMVtext] as C
where C.[sID] = [sv].[sID] and c.fieldID = '130' ) as 'MVtext130/@SVMV'
--,'Multi Value Text Sample' as 'MVtext130/@DisplayName'
--,'MV' as 'MVtext130/@SVMV'
,(SELECT [value] AS 'value'
FROM [docMVtext] as [mv]
WHERE [mv].[sID] = [sv].[sID]
AND [mv].[fieldID] = '130'
ORDER BY [mv].[value]
FOR XML PATH (''), type
) AS "MVtext130"
FROM [docSVsys] as [sv]
WHERE [sv].[sID] >= '57'
ORDER BY [sv].[sParID], [sv].[sID]
FOR XML PATH('Document'), root('Documents')