SQL-返回多个XML结果的xpath
我有一个疑问:SQL-返回多个XML结果的xpath,sql,sql-server,xml,xpath,xquery,Sql,Sql Server,Xml,Xpath,Xquery,我有一个疑问: 从taObjectMetadata中选择XMLMetadata,其中ObjectMetadataTypeId=1 返回3000多行,每行包含XML: <objectMetaData> <fileLocation fileName="CM63951.mxf06092018233409;21.png" /> </objectMetaData> 我需要把那个文件名取出来。使用XQuery,我可以很容易地对任何给定行执行此操作: declar
从taObjectMetadata中选择XMLMetadata,其中ObjectMetadataTypeId=1
返回3000多行,每行包含XML:
<objectMetaData>
<fileLocation fileName="CM63951.mxf06092018233409;21.png" />
</objectMetaData>
我需要把那个文件名取出来。使用XQuery,我可以很容易地对任何给定行执行此操作:
declare @x XML = ('<objectMetaData>
<fileLocation fileName="CM63951.mxf06092018233409;21.png" />
</objectMetaData>')
select x.value(N'@fileName', N'nvarchar(100)') as Filename
from @x.nodes(N'/objectMetaData/fileLocation') t(x)
declare@xxml=('
')
选择x.value(N'@fileName',N'nvarchar(100')作为文件名
从@x.nodes(N'/objectMetaData/fileLocation')t(x)
这正是我所需要的。但是,对于表中的每一组XML,我都需要它。尝试将查询放入声明XML失败,因为它当然会返回多个结果
我需要在这里使用WHILE循环吗。或者有更好/更优雅的方法吗?您可以尝试使用
交叉应用
select x.value('@fileName', N'nvarchar(100)') as Filename
FROM yourTable CROSS APPLY yourTable.data.nodes(N'objectMetaData/fileLocation') as t(x)
注意:您的表格
可以替代当前的结果集
您的查询可能是这样的
select x.value('@fileName', N'nvarchar(100)') as Filename
FROM (
select XMLMetadata
from taObjectMetadata
where ObjectMetadataTypeId = 1
) t1 CROSS APPLY t1.XMLMetadata.nodes(N'objectMetaData/fileLocation') as t(x)
下面是一个示例:您的问题没有弄清楚XML是否总是像您显示的那样(只有一个),或者此结构是否可能包含更多内容 如果这只是一个问题,那么问题可能是:为什么是XML 无论如何:这是两种情况下的模拟场景:
DECLARE @mockup TABLE(ID INT IDENTITY,TheXml XML);
INSERT INTO @mockup VALUES
('<objectMetaData>
<fileLocation fileName="CM63951.mxf06092018233409;21.png" />
</objectMetaData>')
,('<objectMetaData>
<fileLocation fileName="OneMore.png" />
</objectMetaData>')
,('<objectMetaData>
<fileLocation fileName="TheFirst.png" />
<fileLocation fileName="TheSecond.png" />
</objectMetaData>');
--如果有许多
-节点,我们需要通过.nodes()
因此,对于您的实际查询,这应该是
--for one filename per row
select XMLMetadata.value('(/objectMetaData/fileLocation/@fileName)[1]','nvarchar(max)')
from taObjectMetadata
where ObjectMetadataTypeId = 1
还是这个
--for many filenames per row
select fl.value('@fileName','nvarchar(max)')
from taObjectMetadata
cross apply XMLMetadata.nodes('/objectMetaData/fileLocation') A(fl)
where ObjectMetadataTypeId = 1
这只是“一个”,至于“为什么XML”不是我的代码,我问自己同样的问题——提供的数据很可能只是数据。。。!然而,这是我必须处理的。。。我要试试这些,谢谢!
--for one filename per row
select XMLMetadata.value('(/objectMetaData/fileLocation/@fileName)[1]','nvarchar(max)')
from taObjectMetadata
where ObjectMetadataTypeId = 1
--for many filenames per row
select fl.value('@fileName','nvarchar(max)')
from taObjectMetadata
cross apply XMLMetadata.nodes('/objectMetaData/fileLocation') A(fl)
where ObjectMetadataTypeId = 1