我在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。
答案 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');