2016-09-28 45 views
4

我有一個XML文件格式相似:檢索在SQL Server中具有相同前綴的所有XML元素

<XML> 
    <Field1>100</Field1> 
    <Field2>200</Field2> 
    <Field3>300</Field3> 
    <Test>400</Test> 
</XML> 

我需要編寫一個查詢,將得到所有以Field開始元素值。因此,鑑於上述結果的XML應該是

FieldVal 
-------- 
100  
200  
300 

我試過以下,但它不工作:

Select 
    xc.value('text()', 'int') 
From 
    @XMLData.nodes('/XML/[starts-with(name(), ''Field'')]') As xt(xc) 

注:我深知,這個任務可以輕鬆完成如果我重新格式化了我的XML,但不幸的是我無法控制XML的格式。

+2

如果你想g以'Field'開頭的值,你的期望輸出是如何包含'400'的? – techspider

+0

@techspider啊是的好點。這是我的錯誤。我更新了我的預期產出。 – pagspi

回答

4

一種方法是

declare @XMLData xml ='<XML> 
    <Field1>100</Field1> 
    <Field2>200</Field2> 
    <Field3>300</Field3> 
    <Test>400</Test> 
</XML>' 

Select 
    xc.value('.', 'int') 
From @XMLData.nodes('/XML/*') As xt(xc) 
WHERE xc.value('local-name(.)', 'varchar(50)') LIKE 'Field%' 
+0

這正是我所需要的。我不知道你可以使用where子句中的值。我還沒有看到一個這樣做的例子。非常感謝你! – pagspi

+0

@pagspi在這樣一個小的XML中,這是絕對可以的,但是在更大的結構中(或者它們中的很多),我更喜歡一種方法,在這種方法中,您不必閱讀**所有數據**只是爲了過濾它**之後* *。你試圖在XQuery *中放置過濾器*在我眼中更好...... – Shnugo

+1

@Shnugo:SQL中的XML處理通常具有可怕的性能(與關係處理相比)。在這種情況下,我認爲在XML內部或外部過濾是否更好是我們不會樂意的。我會說所有的解決方案都是可行的,直到測量表演否則。 (這和SQL中的XQuery功能非常有限,所以有些過濾甚至是不可能的。) –

4

前綴名有特殊字符和檢查包含代替。

declare @x xml ='<XML> 
    <Field1>100</Field1> 
    <Field2>200</Field2> 
    <Field3>300</Field3> 
    <Test>400</Test> 
</XML>'; 

select t.n.value('.','varchar(100)') 
from @x.nodes ('XML/*[contains(concat("$",local-name()),"$Field")]') t(n); 
4

我認爲這是這一點,你在找什麼:

DECLARE @xml XML= 
'<XML> 
    <Field1>100</Field1> 
    <Field2>200</Field2> 
    <Field3>300</Field3> 
    <Test>400</Test> 
</XML>'; 

SELECT Fld.value('.','int') AS FieldOnly 
FROM @xml.nodes('/XML/*[substring(local-name(.),1,5)="Field"]') AS A(Fld) 

在評論中討論的僅僅是因爲:

DECLARE @fldName VARCHAR(100)='Field'; 
SELECT Fld.value('.','int') AS FieldOnly 
FROM @xml.nodes('/XML/*[substring(local-name(.),1,string-length(sql:variable("@fldName")))=sql:variable("@fldName")]') AS A(Fld) 

更改的第一行 「測試」(情況敏感!),你會得到只有一行400 ...

+0

看起來很整齊。 +1 –

+0

用'字符串長度(「字段」)代替'5'使得代碼更加明顯。即使如此,它也痛苦地證明了XQuery方言支持的限制。 –

+0

謝謝@Shnugo這個解決方案也能工作,它在xquery中處理所有這些,所以我不必加載整個XML和過濾器。 – pagspi

相關問題