2010-11-30 56 views
0

我們在數據庫中有一些xml元素,[對於舊數據]有時可能包含guid並且有時包含整數。安全地從可包含不同值的元素中檢索值

有沒有一種很好的方式來提取所有的整合者?

如果value元素包含guid,將會失敗!

select 
ra.*, 
t.c.value('.', 'int') as organisationId 
from 
    Audit.EmployeeAudit ra 
    cross apply ra.EmployeeXml.nodes('//*:employee/*:property[*:name="ORG"]/*:value') t(c) 

示例XML

<employee> 
    <property> 
    <name>ORG</name> 
    <value>39</value> <!-- Sometimes this will be a guid --> 
    <description>Leeds</description> 
    </property> 
</employee> 

回答

1

你可以斷言增加小於或等於10個字符只匹配條目。

;with EmployeeAudit as 
(

SELECT CAST('<employee><property> 
    <name>ORG</name> 
    <value>39</value> <!-- Sometimes this will be a guid --> 
    <description>Leeds</description> 
</property></employee> 
' AS XML) AS EmployeeXml 
UNION ALL 
SELECT CAST('<employee><property> 
    <name>ORG</name> 
    <value>2FD29F11-59FC-47FD-BC30-DD330A53284E</value> 
    <description>Leeds</description> 
</property></employee> 
' AS XML) 
) 
select 
ra.*, 
t.c.value('.', 'int') as organisationId 
from 
    EmployeeAudit ra 
    cross apply 
    ra.EmployeeXml.nodes 
    ('//*:employee/*:property[*:name="ORG"]/*:value[string-length() <= 10]') t(c) 

或者實際上這可能是有點更強大的

('//*:employee/*:property[*:name="ORG"]/*:value[ceiling(.) = .]') t(c) 
+0

其實我想到了使用內容長度的,它很好地工作..優秀。 – 2010-11-30 17:24:01

相關問題