2016-09-28 73 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

相关问题