2015-09-28 167 views
0

我想在查詢表中的XML字段時使用一個變量來代替XML字符串。SQL Server XML查詢

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

不確切地知道你想要什麼。如果你想要更多的細節,你必須提供你的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; 
+0

@WesPalmer,如果這個答案幫助你,那將是怎樣,你將其標記爲接受和/或點擊upvote.Thx! – Shnugo