【问题标题】:How to remove column name when selecting from a XMLTYPE column using FOR XML PATH使用 FOR XML PATH 从 XMLTYPE 列中选择时如何删除列名
【发布时间】:2011-06-15 05:50:51
【问题描述】:

我有一个带有名为“InvoiceXML”的 XMLTYPE 列的表。

该栏的数据是XML格式:

<Invoice CustomerNum="1234" >
<CustomDeliveryDetails />
</Invoice>

当我做一个

SELECT ... FOR XML PATH(''), ROOT('Invoices') 

我最终得到:

<Invoices>
 <InvoiceXML>
  <Invoice CustomerNum="1234" >
  <CustomDeliveryDetails />
  </Invoice>
 </InvoiceXML>
</Invoices>

如何阻止列名 InvoiceXML 出现在输出中?

【问题讨论】:

    标签: sql xml tsql for-loop xmltype


    【解决方案1】:
    declare @T table (invoiceXML xml)
    
    insert into @T values (
      '<Invoice CustomerNum="1234" >
         <CustomDeliveryDetails />
       </Invoice>
      ')
    
    insert into @T values (
      '<Invoice CustomerNum="4321" >
         <CustomDeliveryDetails />
       </Invoice>
      ')
    
    select (select T.invoiceXML)
    from @T as T
    for xml path(''), root('Invoices')
    

    编辑 1 子查询 (select T.invoiceXML) 没有列名,因此被删除。

    【讨论】:

    • 不错。您可能应该添加解决方案有效的原因:子查询没有名称,因此它没有列名可以放入包含元素中,导致它被删除。
    【解决方案2】:

    试试:

    SELECT cast(cast(InvoiceXML as nvarchar(max)) + '' as XML)
    FROM whatever
    FOR XML PATH(''), ROOT('Invoices')
    

    【讨论】:

    • 不要认为您可以将字符串直接连接到 XML 列上。你需要双重施法:cast(cast(InvoiceXML as nvarchar(max)) + '' as XML)
    • +1 经过进一步审查,我认为它可以进一步简化。我看起来cast(InvoiceXML as XML) 就足够了。
    • 如果我有足够的代表,我会投反对票,因为由于长度限制,转换为 nvarchar(max) 从根本上破坏了 XML 类型。 varchar(max)、nvarchar(max) 和 xml 可以存储 2GB,但 nvarchar 每个字符使用 2 倍的存储空间。参考:technet.microsoft.com/en-us/library/ms186939.aspxmsdn.microsoft.com/en-us/library/ms187339.aspx
    【解决方案3】:

    试试这个:

    SELECT InvoiceXML.query('//Invoice')
      FROM <YOUR_TABLE>
    FOR XML PATH('')
    
    尝试在 FPR XML PATH 中指定要开票的 xpath 查询 例如:`FOR XML PATH('//InvoiceXML')`

    【讨论】:

    • 这行得通吗?当我尝试时,它给了我:Row name '//InvoiceXML' contains an invalid XML identifier as required by FOR XML; '/'(0x002F) is the first character at fault. 删除双斜杠导致&lt;InvoiceXML&gt; 将每一行包装两次。
    • 没有测试早期版本的答案,验证失败:)。用工作版本更新了帖子。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多