我的 xml 数据为:
<data>
<x name="name0">val1</x>
<x name="name1">val2</x>
<x name="name2">val3</x>
<x name="name3">val4</x>
</data>
如何形成一个选择查询来获取属性名称以“name”开头,后跟 0、1、2、3 等的值?
最佳答案
你有两种方法
DECLARE @xml XML=
'<data>
<x name="name0">val1</x>
<x name="name1">val2</x>
<x name="name2">val3</x>
<x name="other">val other</x>
<x name="name3">val4</x>
</data>';
--这将读取所有节点并使用经典的WHERE
WITH CTE AS
(
SELECT x.value('@name','nvarchar(max)') AS x_name
,x.value('.','nvarchar(max)') AS x_value
FROM @xml.nodes('/data/x') AS A(x)
)
SELECT x_value
FROM CTE
WHERE x_name LIKE 'name%';
--这是纯粹的XQuery
SELECT x.value('.','nvarchar(max)') AS x_value
FROM @xml.nodes('/data/x[substring(@name,1,4)="name"]') AS A(x)
更新
如果您需要动态地使用“name”一词,可以使用sql:variable("@VarName")
DECLARE @part NVARCHAR(100)='name';
SELECT x.value('.','nvarchar(max)') AS x_value
FROM @xml.nodes('/data/x[substring(@name,1,4)=sql:variable("@part")]') AS A(x)
两个查询将返回相同的结果(val other 被过滤掉):
val1
val2
val3
val4
关于sql-server - SQL Server 2008 中的 XML 数据类型 - 查找以 "name"开头的所有属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41889433/