SQL Server XML查询

时间:2015-09-28 14:13:12

标签: sql-server-2008-r2

当我查询表格中的XML字段时,我正在尝试使用变量代替XML String。

CASE 
WHEN t.value('(./meta/node()[2]/value)[1]','VARCHAR(100)') = '101' THEN 'ABC'
WHEN t.value('(./meta/node()[2]/value)[1]','VARCHAR(100)') = '201' THEN 'SLM'
WHEN t.value('(./meta/node()[2]/value)[1]','VARCHAR(100)') = '251' THEN 'SPR'
WHEN t.value('(./meta/node()[2]/value)[1]','VARCHAR(100)') = '301' THEN 'FYT'
WHEN t.value('(./meta/node()[2]/value)[1]','VARCHAR(100)') = '350' THEN 'PRR'
...

这个CASE语句有大约20个元素,我正在尝试做类似

的事情
DECLARE @XMLString AS XML
SET @XMLString = './meta/node()[2]/value)[1]'

然后使用变量而不是每次都写字符串,以使我的代码更具动态性。它现在有效,但我很肯定有一些方法可以使它更加动态,速度超过5秒。

1 个答案:

答案 0 :(得分:0)

不知道你想要什么。如果您需要更多详细信息,则必须提供XML的结构以及您希望实现的目标。

您必须了解CTECROSS APPLYnodes()。你的XPath - 表达很可能很复杂。

只是一个例子:

DECLARE @xml XML =
'<root>
    <meta>
        <value>Value1.1</value>
        <value>Value1.2</value>
        <value>Value1.3</value>
        <value>Value1.4</value>
    </meta>
    <meta>
        <value>Value2.1</value>
        <value>Value2.2</value>
        <value>Value2.3</value>
    </meta>
    <meta>
        <value>Value3.1</value>
        <value>Value3.2</value>
    </meta>
</root>';

SELECT value.onevalue.value('.','varchar(max)')
FROM @xml.nodes('/root/meta/value') AS value(onevalue);

--You can use this directly in a case (lot of typing)
--or you could select the needed value directly to use it with less typing

SELECT MyApply.myValue
FROM @xml.nodes('/root/meta/value') AS value(onevalue)
CROSS APPLY(SELECT value.onevalue.value('.','varchar(max)') AS myValue) AS MyApply;