如何在SQL Server中读取格式化的xml文件
我有一个XML文件,需要通过SQLServer2008从中读取一些数据 请指导我解决这个问题 我的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 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代码”和您遇到的确切问题,目前您的问题可能被认为是离题的。