Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-返回多个XML结果的xpath_Sql_Sql Server_Xml_Xpath_Xquery - Fatal编程技术网

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