如何在SQL Server 2008中查询XML列中的值

时间:2015-02-18 04:25:06

标签: sql xml sql-server-2008 sqlxml

我将XML存储在SQL Server数据库表的XML列中。

<?xml version="1.0" encoding="UTF-8" ?>
<ns0:Root>
    <ns0:Result>
        <ns0:AStatus>Aaa</ns0:AStatus>
        <ns0:BStatus>Bbb</ns0:BStatus>
    </ns0:Result>
</ns0:Root>

我希望通过触发SQL查询获得价值&#34; Aaa&#34 ;.

1 个答案:

答案 0 :(得分:1)

您的XML数据不完整 - 它使用命名空间前缀ns0而无需在任何地方定义...我在我的示例中添加了一些任意的,完全构成的XML命名空间 - 您需要检查一下XML名称空间实际上就在您的情况下并相应地调整样本!

试试这个:

DECLARE @InputTable TABLE (ID INT NOT NULL, XmlData XML)

INSERT INTO @InputTable(ID, XmlData) VALUES(42, '<?xml version="1.0" encoding="UTF-8" ?>
<ns0:Root xmlns:ns0="urn:some-sample-xml-namespace">
    <ns0:Result>
        <ns0:AStatus>Aaa</ns0:AStatus>
        <ns0:BStatus>Bbb</ns0:BStatus>
    </ns0:Result>
</ns0:Root>')

-- define the XML namespace to use     
;WITH XMLNAMESPACES('urn:some-sample-xml-namespace' AS x)
SELECT 
    ID,
    XC.value('(x:AStatus)[1]', 'varchar(50)') 
FROM    
    @inputtable
CROSS APPLY
    -- get a "pseudo" table of nodes <ns0:Root>/<ns0:Result>
    XmlData.nodes('x:Root/x:Result') AS XT(XC)

基本上,您需要为XML名称空间前缀设置定义 - 并且在针对此XML数据的SELECT中,您需要相同 XML命名空间(即使 - 如图所示 - 分配给该命名空间的前缀可能不同 - 但命名空间必须匹配!)。

然后从表中选择数据,对于XML数据,它使用.nodes() XQuery函数获取与此XPath表达式匹配的XML元素列表 - 并将这些节点作为 - 内存伪表XT,其中包含一个XML列XC,然后您可以从中再次获取值(例如进入第一个<ns:AStatus>元素)。