Sql server 用于XML格式化的TSQL

Sql server 用于XML格式化的TSQL,sql-server,xml,tsql,for-xml-path,Sql Server,Xml,Tsql,For Xml Path,我有一个表,我想转换成XML格式。该表被称为诱惑表,并保存以下数据: REF DESC QTY 100001 Normal 1 100002 OOH 1 我需要以以下给定格式创建XML: <row> <LIN NUM="1"> <FLD NAME="REF">100001</FLD> <FLD NAME="DES">Normal</FLD> <FLD NA

我有一个表,我想转换成XML格式。该表被称为诱惑表,并保存以下数据:

REF     DESC     QTY
100001  Normal   1
100002  OOH      1
我需要以以下给定格式创建XML:

<row>
  <LIN NUM="1">
    <FLD NAME="REF">100001</FLD>
    <FLD NAME="DES">Normal</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="2">
    <FLD NAME="REF">100002</FLD>
    <FLD NAME="DES">OOH</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
</row>
然而,这会产生:

<row>
  <LIN NUM="1">
    <REF>100001</REF>
    <DES>Normal</DES>
    <QTY>1</QTY>
  </LIN>
  <LIN NUM="1">
    <REF>100002</REF>
    <DES>OOH</DES>
    <QTY>1</QTY>
  </LIN>
</row>

100001
正常的
1.
100002
哦
1.
有人知道我如何做到:

  • A) 将“LIN”“NUM”属性更改为基于 那个订单的记录
  • B) 将“名称”属性添加到“LIN”详细信息并更改 “FLD”的字段名。当我尝试将名称更改为“FLD”时 将值合并到单个节点上,例如:

    <row>
      <LIN NUM="1">
        <FLD>100001Normal1</FLD>
      </LIN>
      <LIN NUM="1">
        <FLD>100002OOH1</FLD>
      </LIN>
    </row>
    
    
    1000011
    100002OOH1
    
我假设我可以添加“NAME”属性来分隔这些值

如有任何建议/帮助,将不胜感激

谢谢

产生:

<row>
  <LIN NUM="1">
    <REF>100001</REF>
    <DES>Normal</DES>
    <QTY>1</QTY>
  </LIN>
  <LIN NUM="1">
    <REF>100002</REF>
    <DES>OOH</DES>
    <QTY>1</QTY>
  </LIN>
</row>
<row>
  <LIN NUM="1">
    <FLD NAME="REF">100001</FLD>
    <FLD NAME="DES">Normal</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="2">
    <FLD NAME="REF">100002</FLD>
    <FLD NAME="DES">OOH</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
</row>

100001
正常的
1.
100002
哦
1.
如果没有select中节点和属性之间的空字符串,SQL Server将提供一个错误:

以属性为中心的列“FLD/@NAME”不能位于FOR XML PATH中XML层次结构中非以属性为中心的同级之后

编辑:正如评论中提到的,解释了为什么空报价技巧有效

总结如下:

  • 在XML路径的
    中,没有名称的列成为文本节点
    
    • NULL
      '
      因此成为空文本节点
    • 您可以使用
      AS*
    • 这有助于将以前的输出节点与下一个节点分开,以便SQL Server知道(例如)为下一列启动新元素。否则,当属性已经存在于它认为是“当前”元素上时,它就会感到困惑

我不知道空字符串的诀窍,只是对此感到困惑。很好…@Shnugo关于这个把戏的实际作用。你能解释一下吗?
<row>
  <LIN NUM="1">
    <FLD NAME="REF">100001</FLD>
    <FLD NAME="DES">Normal</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="2">
    <FLD NAME="REF">100002</FLD>
    <FLD NAME="DES">OOH</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
</row>
DECLARE @t TABLE (ref varchar(10), descr varchar(10), qty varchar(3))
insert into @t
values('100001', 'Normal', '1'),('10002','OOH','1')

SELECT ROW_NUMBER() OVER (ORDER BY a.ref) AS '@NUM',
(SELECT 'REF' AS 'FLD/@NAME'
 ,ref AS 'FLD'
FROM @t AS FLD
WHERE FLD.ref = a.ref
FOR XML PATH(''), TYPE),
(SELECT 'DESCR' AS 'FLD/@DESCR'
 ,descr AS 'FLD'
FROM @t AS FLD
WHERE FLD.ref = a.ref
FOR XML PATH(''), TYPE),
(SELECT 'QTY' AS 'FLD/@QTY'
 ,QTY AS 'FLD'
FROM @t AS FLD
WHERE FLD.ref = a.ref
FOR XML PATH(''), TYPE)
FROM @t AS a
FOR XML PATH('LIN'), ROOT('row')