Как выбрать имя возвращаемого столбца в запросе SELECT FOR XML? - PullRequest
47 голосов
/ 20 ноября 2008

MS SQL имеет удобный обходной путь для объединения значения столбца из нескольких строк в одно значение:

SELECT col1
 FROM table1
 WHERE col2 = 'x'
 ORDER by col3
 FOR XML path('')

и это возвращает хороший набор записей:

XML_F52E2B61-18A1-11d1-B105-00805F49916B                                     
---------------------------------------- 
<col1>Foo</col1><col1>Bar</col1>

только имя столбца в возвращенном наборе записей довольно неприятно!

Кажется, что имя столбца включает в себя случайные элементы (или GUID), и поэтому я неохотно использую его в моем приложении (разные экземпляры или разные серверы могут иметь другой GUID). К сожалению, я не могу использовать * для выбора значения, и из-за ограничений в существующем приложении я не могу перебрать и возвращенные столбцы ...

Есть ли способ заставить имя столбца в возвращенном наборе записей сделать что-то более разумное?

Ответы [ 6 ]

70 голосов
/ 20 ноября 2008

Что должно сделать:

select(
SELECT col1
 FROM table1
 WHERE col2 = 'x'
 ORDER by col3
 FOR XML path('')
) as myName

Не красиво, но должно дать результат, который вам нужен

12 голосов
/ 18 апреля 2013

Попробуйте это ...

select
(
    select '@greeting' = 'hello', '@where' = 'there', '@who' = 'world'
    for xml path ('salutation'), type
) as 'MyName'

Примечание: если вы опустите «type» после «for xml», вы получите (я думаю) строку.

2 голосов
/ 31 июля 2012

хранимая процедура

declare @requestResultXML xml

set @requestResultXML =
            (
                SELECT 'NPOIT-1.0' AS '@Interface',
                (
                    select  'Query'     as '@Type',
                            'GetBill'   as '@Query',
                            'True'      as '@CompressResult'
                        FOR XML PATH('Head'), TYPE
                ),
                (
                    select  @pin        as '@PIN',
                            @period     as '@Period',
                            @number     as '@Number',
                            @barcode    as '@Barcode'
                        FOR XML PATH('QueryParams'), TYPE
                )   as Data

                FOR XML PATH('DataExchangeModule')              
            )

select @requestResultXML as GetBillRequest
1 голос
/ 27 октября 2017
DECLARE @XmlData XML;
SET @XmlData =(SELECT * FROM [dbo].[Users] ORDER by UserName FOR XML path(''))
SELECT @XmlData AS Result
0 голосов
/ 27 октября 2017
DECLARE @XmlData XML;

SET @XmlData = (
        SELECT *
        FROM [dbo].[TABLE1]
        FOR XML PATH('ChildNodeDetailsResponse')
            ,ROOT('ParentNode')
        )

SELECT @XmlData AS Result
0 голосов
/ 16 января 2015

Для генерации EXPLICIT xml - с союзами вам нужно обернуть результаты еще раз (В качестве бонуса в виде XML):

SELECT 
    CAST(  
        (
            SELECT 
                * 
            FROM (
                SELECT 
                    1 AS Tag
                    ,NULL AS Parent
                    ...
                UNION ALL
                SELECT ...
                FOR XML EXPLICIT
            )
        ) as XML) as [MyName]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...