Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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中读取格式化的xml文件_Sql_Sql Server_Xml_Import_Xml Parsing - Fatal编程技术网

如何在SQL Server中读取格式化的xml文件

如何在SQL Server中读取格式化的xml文件,sql,sql-server,xml,import,xml-parsing,Sql,Sql Server,Xml,Import,Xml Parsing,我有一个XML文件,需要通过SQLServer2008从中读取一些数据 请指导我解决这个问题 我的XML文件如下所示: <?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://tempuri.org/"> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="ur

我有一个XML文件,需要通过SQLServer2008从中读取一些数据

请指导我解决这个问题

我的XML文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="Table">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="CI_CODE" type="xs:decimal" minOccurs="0" />
                <xs:element name="CI_NAME" type="xs:string" minOccurs="0" />
                <xs:element name="CI_PISH_CODE" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <NewDataSet xmlns="">
      <Table diffgr:id="Table1" msdata:rowOrder="0">
        <CI_CODE>1</CI_CODE>
        <CI_NAME>Kerman</CI_NAME>
        <CI_PISH_CODE>34</CI_PISH_CODE>
      </Table>
      <Table diffgr:id="Table2" msdata:rowOrder="1">
        <CI_CODE>2</CI_CODE>
        <CI_NAME>Anar</CI_NAME>
        <CI_PISH_CODE>34</CI_PISH_CODE>
      </Table>
      <Table diffgr:id="Table3" msdata:rowOrder="2">
        <CI_CODE>3</CI_CODE>
        <CI_NAME>Baft</CI_NAME>
        <CI_PISH_CODE>34</CI_PISH_CODE>
      </Table>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>

1.
克曼
34
2.
阿纳尔
34
3.
巴夫特
34
我需要帮助在SQLServer2008中阅读此XML

我需要标签
数据


请指导我

假设您的XML存储在名为
@Data XML
的变量中,您可以使用此XQuery获取数据

XPath表达式沿节点树向下“导航”,为您提供一个XML片段的“虚拟”表—每个
XML元素一个。然后,可以使用
.value()
XQuery表达式从该XML元素中获取各个数据项

您需要特别注意为每个元素使用正确的XML名称空间

;WITH XMLNAMESPACES('http://tempuri.org/' AS ns, 
                    'urn:schemas-microsoft-com:xml-diffgram-v1' AS dg)
SELECT
    CI_CODE = XC.value('(CI_CODE)[1]', 'int'),
    CI_NAME = XC.value('(CI_NAME)[1]', 'varchar(50)'),
    CI_PISH_CODE = XC.value('(CI_PISH_CODE)[1]', 'int')
FROM
    @Data.nodes('/ns:DataSet/dg:diffgram/NewDataSet/Table') AS XT(XC)
这会在我的电脑上产生以下输出:


总的来说,我建议您尽可能具体。在这种情况下,您有不干净的名称空间(在
schema
级别为空的默认名称空间),这使得正确查询该名称空间非常困难

尝试使用通配符名称空间(
*:
):

编辑:简化 --您的XML是一个变量

DECLARE @xml XML=
'Copy your XML here';
--询问

SELECT dgt.value('(@*:id)[1]','nvarchar(max)') AS DiffgramTable
      ,dgt.value('(*:CI_CODE)[1]','int') AS Diffgram_CI_CODE
      ,dgt.value('(*:CI_NAME)[1]','nvarchar(max)') AS Diffgram_CI_NAME
      ,dgt.value('(*:CI_PISH_CODE)[1]','int') AS Diffgram_CI_CODE
FROM @xml.nodes('/*:DataSet') AS A(ds)
OUTER APPLY ds.nodes('*:diffgram') AS C(dg)
OUTER APPLY dg.nodes('*:NewDataSet/*:Table') AS D(dgt)
首先,我们选择“数据集”并将其称为“ds”。下面我们选择“diffgram”(“dg”)。在“dg”下面,我们选择所有“表格”(“dgt”)

选择按钮将从最近的节点读取所有信息

结果

+---------------+------------------+------------------+------------------+
| DiffgramTable | Diffgram_CI_CODE | Diffgram_CI_NAME | Diffgram_CI_CODE |
+---------------+------------------+------------------+------------------+
| Table1        | 1                | Kerman           | 34               |
+---------------+------------------+------------------+------------------+
| Table2        | 2                | Anar             | 34               |
+---------------+------------------+------------------+------------------+
| Table3        | 3                | Baft             | 34               |
+---------------+------------------+------------------+------------------+
请参阅“尝试并显示您的sql代码”和您遇到的确切问题,目前您的问题可能被认为是离题的。