从SQL Server中的XML字段中选择一个值

时间:2018-01-17 16:53:56

标签: sql sql-server xml xquery

我在SQL Server表中有一个XML列。 XML是这样的:

    <Dictionary>
        <Keys>
            <GenericKeys>
                <GenericKey>
                    <KeySets>
                        <KeySet>
                            <Key>A</Key>
                            <Value>123</Value>
                        </KeySet>
                        <KeySet>
                            <Key>B</Key>
                            <Value>456</Value>
                        </KeySet>
                        <KeySet>
                            <Key>C</Key>
                            <Value>789</Value>
                        </KeySet>
                    </KeySets>
                </GenericKey>
            </GenericKeys>
        </Keys>
    </Dictionary>

如何查询密钥B的值?在这个例子中,我需要值456。

2 个答案:

答案 0 :(得分:1)

以下是使用value方法

的一种方法
SELECT Key = r.value('(./Key)[1]', 'varchar(100)'),
       Value = r.value('(./Value)[1]', 'int')
FROM   Yourtable a
       CROSS APPLY xmlcolumn.nodes('/Dictionary/Keys/GenericKeys/GenericKey/KeySets/KeySet') AS x(r) 
WHERE  r.value('(./Key)[1]', 'varchar(100)') = 'B' 

答案 1 :(得分:1)

如果您只需要给定键的值,您可以这样尝试:

DECLARE @xml XML=
N'<Dictionary>
        <Keys>
            <GenericKeys>
                <GenericKey>
                    <KeySets>
                        <KeySet>
                            <Key>A</Key>
                            <Value>123</Value>
                        </KeySet>
                        <KeySet>
                            <Key>B</Key>
                            <Value>456</Value>
                        </KeySet>
                        <KeySet>
                            <Key>C</Key>
                            <Value>789</Value>
                        </KeySet>
                    </KeySets>
                </GenericKey>
            </GenericKeys>
        </Keys>
    </Dictionary>';

--directly (hardcoded)
SELECT @xml.value(N'(//KeySet[Key="B"]/Value/text())[1]','int');

--Pass the key through a variable
DECLARE @SearchFor VARCHAR(100)='B';
SELECT @xml.value(N'(//KeySet[Key=sql:variable("@SearchFor")]/Value/text())[1]','int');

一般情况下,最好避免使用//进行深度搜索。建议是:尽可能具体。所以最好的(也是最快的)是:

SELECT @xml.value(N'(/Dictionary/Keys/GenericKeys/GenericKey/KeySets/KeySet[Key=sql:variable("@SearchFor")]/Value/text())[1]','int');