Sql server 将SQL表转换为XML

Sql server 将SQL表转换为XML,sql-server,xml,Sql Server,Xml,我一直在努力将SQL表元素转换为3层XML表。我几乎就在那里了,但我知道我只是少了一小块 以下是我想要的: <labels _FORMAT="\US Labels\ChemSamples.lwl" _QUANTITY="1" _PRINTERNUMBER="10"> <label> <variable name="HBANumber">1234</variable> <variable name="BatchNumber"

我一直在努力将SQL表元素转换为3层XML表。我几乎就在那里了,但我知道我只是少了一小块

以下是我想要的:

<labels _FORMAT="\US Labels\ChemSamples.lwl" _QUANTITY="1" _PRINTERNUMBER="10">
  <label>
    <variable name="HBANumber">1234</variable>
    <variable name="BatchNumber">567</variable>
    <variable name="BagNumber">1</variable>
    <variable name="CombinedBarcodeTop">123601</variable>
    <variable name="CombinedBarcodeText">123601</variable>
    <variable name="HBANumberSmall">1234</variable>
    <variable name="CombinedSmall">123601</variable>
    <variable name="CombinedBarcodeBottom">123601</variable>
    <variable name="CreatedDate">02/10/2015</variable>
    <variable name="Operator">7197</variable>
    <variable name="PrintDate">02/10/2015</variable>
  </label>
</labels>
执行此查询将返回以下结果:

<labels _FORMAT="\US Labels\ChemSamples.lwl" _QUANTITY="1" _PRINTERNUMBER="10">
  <label>
    <variable name="HBANumber">
      <variable>1234</variable>
    </variable>
    <variable name="BatchNumber">
      <variable>567</variable>
    </variable>
    <variable name="BagNumber">
      <variable>1</variable>
    </variable>
    <variable name="CombinedBarcodeTop">
      <variable>123601</variable>
    </variable>
    <variable name="CombinedBarcodeText">
      <variable>123601</variable>
    </variable>
    <variable name="HBANumberSmall">
      <variable>1234</variable>
    </variable>
    <variable name="CombinedSmall">
      <variable>123601</variable>
    </variable>
    <variable name="CombinedBarcodeBottom">
      <variable>123601</variable>
    </variable>
    <variable name="CreatedDate">
      <variable>02/10/2015</variable>
    </variable>
    <variable name="Operator">
      <variable>7197</variable>
    </variable>
    <variable name="PrintDate">
      <variable>02/10/2015</variable>
    </variable>
  </label>
</labels>

1234
567
1.
123601
123601
1234
123601
123601
02/10/2015
7197
02/10/2015
有没有人知道我该怎么做才能让它看起来像我列出的第一个项目


谢谢

我想这应该适合你:

SELECT 
    '\US Labels\ChemSamples.lwl' AS '@_FORMAT',
    1 AS '@_QUANTITY',
    10 AS '@_PRINTERNUMBER',
    (select null,
        (SELECT 1 AS Tag, 
                NULL AS Parent, 
                fieldname AS [variable!1!name], 
                fieldvalue AS [variable!1!!ELEMENT]
          FROM @tmpTable
        FOR XML EXPLICIT, TYPE)
     FOR XML PATH ('label'), TYPE)
FOR XML PATH ('labels')
关键是使用FOR XML EXPLICIT子句,以允许您以更大的控制来格式化XML,将两个属性和值混合到同一个节点中的秘密是在第二个子句中省略节点名称(两个“!!”相邻)

当我运行它时,它会为我返回什么:

<labels _FORMAT="\US Labels\ChemSamples.lwl" _QUANTITY="1" _PRINTERNUMBER="10">
  <label>
    <variable name="HBANumber">1234</variable>
    <variable name="BatchNumber">567</variable>
    <variable name="BagNumber">1</variable>
    <variable name="CombinedBarcodeTop">123601</variable>
    <variable name="CombinedBarcodeText">123601</variable>
    <variable name="HBANumberSmall">1234</variable>
    <variable name="CombinedSmall">123601</variable>
    <variable name="CombinedBarcodeBottom">123601</variable>
    <variable name="CreatedDate">02/10/2015</variable>
    <variable name="Operator">7197</variable>
    <variable name="PrintDate">02/10/2015</variable>
  </label>
</labels>

1234
567
1.
123601
123601
1234
123601
123601
02/10/2015
7197
02/10/2015

我希望这有帮助

@pmbAustin,实际上不需要XML显式,这将得到请求的结果。要获得结果,请将
,[variable]=fieldvalue
替换为
,[text()]=fieldvalue

SELECT 
      [@_FORMAT]          = '\US Labels\ChemSamples.lwl'
    , [@_QUANTITY]        = 1
    , [@_PRINTERNUMBER]   = 10
    , [label]             = (   SELECT 
                                      [@name]       = fieldname 
                                    , [variable]    = fieldvalue
                                FROM @tmpTable
                                FOR XML PATH ('variable'), TYPE
                            )
FOR XML PATH ('labels')

实际上,我手头没有SQLServer来尝试此操作,但是如果您将最内层的select更改为“select fieldname AS'@name',fieldvalue from@tmpTable for XML path('variable'),type”,会发生什么情况?我知道,如果您希望它像值属性一样(fieldvalue AS'@value'),您可以轻松地将其作为前一个变量的一部分,然而,根据我的经验,组合属性和标记值的唯一方法是自定义创建XML。这个链接是我常用的一个资源:@unigeek,我以前试过这个方法,然后得到了value元素。@Duffmaster33,谢谢你的资源!这很接近,元素实际上看起来像:,所以我必须看看我们的软件是否能够处理这种结构。当我运行它时,它看起来不是那样的。。。人力资源管理。。。你使用的是什么版本的SQL Server?我重新测试了SQL并重新粘贴了它,以防我在这里的消息中输入了错误(我在事后编辑了它,可能弄糟了什么)。我还复制并粘贴了我看到的结果。你能再试一次吗?效果很好!!我想我漏掉了双份!!关于元素。谢谢我们正在使用SQL Server 2014。感谢您提供的信息。。。没错,用[text()]替换[variable]后,您确实得到了所需的结果。
SELECT 
      [@_FORMAT]          = '\US Labels\ChemSamples.lwl'
    , [@_QUANTITY]        = 1
    , [@_PRINTERNUMBER]   = 10
    , [label]             = (   SELECT 
                                      [@name]       = fieldname 
                                    , [variable]    = fieldvalue
                                FROM @tmpTable
                                FOR XML PATH ('variable'), TYPE
                            )
FOR XML PATH ('labels')