【问题标题】:How to choose returned column name in a SELECT FOR XML query?如何在 SELECT FOR XML 查询中选择返回的列名?
【发布时间】:2008-11-20 10:53:31
【问题描述】:

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)。不幸的是,我无法使用 * 来选择值,并且由于现有应用程序的限制,我也无法遍历返回的列...

有没有办法强制返回记录集中的列名更合理?

【问题讨论】:

    标签: sql sql-server xml sql-server-2005


    【解决方案1】:

    应该这样做:

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

    不漂亮,但应该给出你需要的结果

    【讨论】:

    • 由于您的回复,我找到了解决问题的方法。非常感谢!
    【解决方案2】:

    试试这个...

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

    注意:如果你在“for xml”后面省略“type”,你会得到(我认为)一个字符串。

    【讨论】:

    • 是的。如果要保留结果列的 xml 数据类型,则需要 TYPE。
    • 类型注释正是我要找的,谢谢!
    【解决方案3】:

    存储过程

    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
    

    【讨论】:

    • 想评论您的代码?通过 12 次投票和简单的代码,它为当前接受的答案增加了什么?
    • 其实还是有细微差别的。您会注意到 Vadym 返回一个“Xml”类型的局部变量。在接受的答案中,结果是(我认为)一个字符串。我知道它看起来不应该是,但它肯定不是“Xml”类型。
    • 还有第二个微妙之处。当您选择“for Xml”时,会在生成一些 Xml 时获得一行(即某些源记录符合您的条件),或者您获得零行。当您(有效地)使 Xml 生成成为子查询时,您总是会得到一行。然后,您必须通过行数以外的方式确定数据是否缺失。
    【解决方案4】:

    对于 EXPLICIT xml 生成 - 使用联合,您需要再包装一次结果 (作为 XML 的额外结果):

    SELECT 
        CAST(  
            (
                SELECT 
                    * 
                FROM (
                    SELECT 
                        1 AS Tag
                        ,NULL AS Parent
                        ...
                    UNION ALL
                    SELECT ...
                    FOR XML EXPLICIT
                )
            ) as XML) as [MyName]
    

    【讨论】:

      【解决方案5】:
      DECLARE @XmlData XML;
      SET @XmlData =(SELECT * FROM [dbo].[Users] ORDER by UserName FOR XML path(''))
      SELECT @XmlData AS Result
      

      【讨论】:

      • 此格式将结果保留为 XML 类型。如果是Select(Query) as ColumnName fomat,则结果是刺痛而不是 XML。
      【解决方案6】:
      DECLARE @XmlData XML;
      
      SET @XmlData = (
              SELECT *
              FROM [dbo].[TABLE1]
              FOR XML PATH('ChildNodeDetailsResponse')
                  ,ROOT('ParentNode')
              )
      
      SELECT @XmlData AS Result
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      • 如果不想要任何xml节点请参考下面的代码
      • Edit 答案并添加一些额外的 cmets 说明为什么会这样。
      • 欢迎来到 Stack Overflow!虽然此代码 sn-p 可能是解决方案,但including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多