我有XML文件需要SQL Server 2008从中读取一些数据。
请指导我解决这个问题。
我的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>
我需要帮助在SQL Server 2008中阅读此XML。
我需要标记<CI_CODE>
以及<CI_NAME>
和<CI_PISH_CODE>
数据。
请指导我
答案 0 :(得分:1)
假设您的XML存储在名为@Data XML
的变量中,您可以使用此XQuery获取您的数据。
XPath表达式&#34;导航&#34;在节点树下面给你一个&#34;虚拟&#34; XML片段表 - 每个<Table>
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)
这会在我的电脑上产生这个输出:
答案 1 :(得分:0)
总的来说,我建议你尽可能具体。在这种情况下,您有不洁的命名空间(schema
级别的空默认命名空间),这使得很难正确地查询它。
尝试使用wild wildcarded namespace(*:
):
- 变量中的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)
首先我们选择“DataSet”并将其命名为“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 |
+---------------+------------------+------------------+------------------+