当我查询表格中的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秒。
答案 0 :(得分:0)
不知道你想要什么。如果您需要更多详细信息,则必须提供XML的结构以及您希望实现的目标。
您必须了解CTE
,CROSS APPLY
和nodes()
。你的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;