如何在SQL Server表中将XML从一种格式写入另一种格式?

时间:2012-01-23 19:59:50

标签: sql-server xml

我有问题。我有一个SQL Server表,它在一列中存储了一堆XML文档。我需要将这些XML文档传递给XML解析器,但我的起始XML的格式不是解析器可以接受的格式。这是我必须要做的事情 -

存储在我的SQL Server表中的XML采用以下格式:

<Document ID="207">
  <Version>1.0</Version>
  <LastModifiedInVersion>1.0</LastModifiedInVersion>
  <Signatures />
  <Controls>
    <Control ID="EmpID">
      <Value>45678</Value>
    </Control>
    <Control ID="EmpFN">
      <Value>Ryn</Value>
    </Control>
    <Control ID="EmpLN">
      <Value>Veris</Value>
    </Control>
    <Control ID="EmpDOB">
      <Value>01/19/1980</Value>
    </Control>
  </Controls>
  <AutoKeys />
</Document>

我需要使用XML并使其看起来像这样:

<xml_record>
<employee>
    <EmpID value="45678"/>
    <EmpFN value="Ryn"/>
    <EmpLN value="Veris"/>
    <empDOB value="01/19/1980"/>
</employee>
</xml_record>

我研究过使用XSLT,但它似乎都是基于在浏览器中显示XML数据而不是实际格式的翻译。我的最终目标是简单地翻译格式并使用XML解析器拉取员工值以填充另一个表,我不需要任何原始XML的其余部分。我想要做甚么可能吗?如果是这样,只要指出我正确的方向就会很棒。

1 个答案:

答案 0 :(得分:1)

试试这个:

DECLARE @xdoc xml = '<Document ID="207">
  <Version>1.0</Version>
  <LastModifiedInVersion>1.0</LastModifiedInVersion>
  <Signatures />
  <Controls>
    <Control ID="EmpID">
      <Value>45678</Value>
    </Control>
    <Control ID="EmpFN">
      <Value>Ryn</Value>
    </Control>
    <Control ID="EmpLN">
      <Value>Veris</Value>
    </Control>
    <Control ID="EmpDOB">
      <Value>01/19/1980</Value>
    </Control>
  </Controls>
  <AutoKeys />
</Document>
'


SELECT 
    EmpID   'EmpID/@value',
    EmpFN    'EmpFN/@value',
    EmpLN    'EmpLN/@value',
    EmpDOB   'EmpDOB/@value'
FROM (
SELECT 
    @xdoc.query('//Control[@ID = "EmpID"]/Value').value('.','INT') AS EmpID,
    @xdoc.query('//Control[@ID = "EmpFN"]/Value').value('.','VARCHAR(100)') AS EmpFN,
    @xdoc.query('//Control[@ID = "EmpLN"]/Value').value('.','VARCHAR(100)') AS EmpLN,
    @xdoc.query('//Control[@ID = "EmpDOB"]/Value').value('.','VARCHAR(100)') AS EmpDOB
)t
FOR XML PATH('employee'), ROOT('xml_record')

不是最优雅,但有效。