2012-04-29 27 views
3

当您从XML和节点中删除<data>包装时,此代码正常工作,但是当您添加它时,如下所示,我得到0个结果。当XML有2个包装时,无法读取内容

-- Declare XML variable 
    DECLARE @data XML; 

    -- Element-centered XML 
    SET @data = 
    N' 
    <data xmlns="test.xsd"> 
    <subdata> 
     <customer> 
     <id>1</id> 
     <name>Allied Industries</name> 
     </customer> 
     <customer> 
     <id>2</id> 
     <name>Trades International</name> 
     </customer> 
    </subdata> 
    </data>'; 

    -- Using the query() method 
    SELECT T.customer.query('id').value('.', 'INT') AS customer_id, 
     T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name 
    FROM @data.nodes('data/subdata/customer') AS T(customer); 

但正常工作时,我不喜欢这样写道:

-- Element-centered XML 
    SET @data = 
    N' 
    <subdata> 
     <customer> 
     <id>1</id> 
     <name>Allied Industries</name> 
     </customer> 
     <customer> 
     <id>2</id> 
     <name>Trades International</name> 
     </customer> 
    </subdata> 
'; 

    -- Using the query() method 
    SELECT T.customer.query('id').value('.', 'INT') AS customer_id, 
     T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name 
    FROM @data.nodes('subdata/customer') AS T(customer); 

有谁知道为什么我没有在第一个例子中得到结果,当<data>父包装是吗?

回答

6

该问题与XML数据的“包装”数量无关。问题是:您的第一个示例在<data>节点上定义了XML名称空间xmlns="test.xsd"),但您的查询不符合该要求。

你需要改变你的查询是这样的:

-- Using the query() method 
;WITH XMLNAMESPACES (DEFAULT 'test.xsd') 
SELECT 
    T.customer.query('id').value('.', 'INT') AS customer_id, 
    T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name 
FROM 
    @data.nodes('data/subdata/customer') AS T(customer); 

你将得到的结果....

没有这个XML命名空间声明,您的查询会工作得很好 - 两个包装或更多无所谓..

+0

雅它做了,谢谢..我也有这个'<?xml version =“1.0”encoding =“utf-8”?>'的另一个问题,当它从上面开始,我得到一个错误,说'不能改变xml的编码类型,如果你很快就知道它,你怎么得到这个当你的xm l文件在顶部带有这个文件吗? –

+2

@ZeeTee:我相信如果你用一个'N'来给你的XML数据加前缀,那么它不会像utf-8声明(因为它现在是一个'NVARCHAR'字符串,因此使用UCS-2 Unicode编码)。要么删除该XML声明行,要么删除“N”前缀。 –

+0

是的,你真棒,那(删除N')也做了伎俩..谢谢! –