Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何将SQL Server表中的XML从一种格式写入另一种格式?_Sql Server_Xml - Fatal编程技术网

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

Sql server 如何将SQL Server表中的XML从一种格式写入另一种格式?,sql-server,xml,Sql Server,Xml,我有个问题。我有一个SQL Server表,它在一列中存储了大量XML文档。我需要将这些XML文档传递给XML解析器,但启动XML的格式不是解析器可以接受的格式。这是我必须处理的问题- 存储在我的SQL Server表中的XML采用以下格式: <Document ID="207"> <Version>1.0</Version> <LastModifiedInVersion>1.0</LastModifiedInVersion>

我有个问题。我有一个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>

1
1
45678
莱恩
威利斯
01/19/1980
我需要使用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的其余部分。我想做的事情可能吗?如果是这样的话,给我指出正确的方向就好了。

试试这个:

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')
DECLARE@xdoc-xml='1〕
1
1
45678
莱恩
威利斯
01/19/1980
'
挑选
EmpID'EmpID/@value',
EmpFN‘EmpFN/@value’,
empn'empn/@value',
EmpDOB‘EmpDOB/@value’
从(
挑选
@xdoc.query('//Control[@ID=“EmpID”]/Value')。值('.','INT')作为EmpID,
@xdoc.query('//Control[@ID=“EmpFN”]/Value')。值('.','VARCHAR(100)'作为EmpFN,
@xdoc.query('//Control[@ID=“empn”]/Value')。值('.','VARCHAR(100)'作为empn,
@xdoc.query('//Control[@ID=“EmpDOB”]/Value')。值('.','VARCHAR(100)')作为EmpDOB
)t
对于XML路径('employee'),根('XML_记录')

这不是最优雅的,但很有效。

不知道MS环境中是否存在这样的库,但这听起来像是一个XQuery任务。看看这里,SQL Server似乎有一些XQuery支持。哇,我得试一试!我会让你知道它是如何运作的,非常感谢你的投入!