Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
使用T-SQL中的XPath选择实体_Sql_Xml_Tsql_Xpath - Fatal编程技术网

使用T-SQL中的XPath选择实体

使用T-SQL中的XPath选择实体,sql,xml,tsql,xpath,Sql,Xml,Tsql,Xpath,我有一个表,实体有一个XML字段(描述符),如下所示: <component uid="a1"> <files> <group name="component"> <file path="a1.bmp" md5="0315DBA4FBEEB917F41AFF1A1BFF549B" /> <file path="a2.jpg" md5="C3107D8BFA0EF0C02434FB7FC7472EAC" /&

我有一个表,实体有一个XML字段(描述符),如下所示:

<component uid="a1">
  <files>
    <group name="component">
      <file path="a1.bmp" md5="0315DBA4FBEEB917F41AFF1A1BFF549B" />
      <file path="a2.jpg" md5="C3107D8BFA0EF0C02434FB7FC7472EAC" />
      <file path="a3.bmp" md5="603B9635A4921C25D50844254A2B573D" />
      <file path="a4.ini" md5="9C12CC7F5C1F1F4240DA407F7E3B145E" />
    </group>
  </files>
</component>

问题是,当第一个文件具有特定的md5值时,它会找到该项。我想要的是在任何文件项具有特定md5值时查找。

您可以使用XML方法
exist()
简单地检查元素的存在性

我使用声明的表变量模拟您的场景。插入三个不同的案例:

DECLARE @dummy TABLE(EntityID INT IDENTITY,SomeText VARCHAR(100),Descriptor XML);
INSERT INTO @dummy VALUES
('MD5 03... on first place',
N'<component uid="a1">
  <files>
    <group name="component">
      <file path="a1.bmp" md5="0315DBA4FBEEB917F41AFF1A1BFF549B" />
      <file path="a2.jpg" md5="C3107D8BFA0EF0C02434FB7FC7472EAC" />
      <file path="a3.bmp" md5="603B9635A4921C25D50844254A2B573D" />
      <file path="a4.ini" md5="9C12CC7F5C1F1F4240DA407F7E3B145E" />
    </group>
  </files>
</component>')
,('MD5 03... somewhere',
N'<component uid="a1">
  <files>
    <group name="component">
      <file path="a2.jpg" md5="C3107D8BFA0EF0C02434FB7FC7472EAC" />
      <file path="a3.bmp" md5="603B9635A4921C25D50844254A2B573D" />
      <file path="a1.bmp" md5="0315DBA4FBEEB917F41AFF1A1BFF549B" />
      <file path="a4.ini" md5="9C12CC7F5C1F1F4240DA407F7E3B145E" />
    </group>
  </files>
</component>')
,('MD5 03... not existing',
N'<component uid="a1">
  <files>
    <group name="component">
      <file path="a2.jpg" md5="C3107D8BFA0EF0C02434FB7FC7472EAC" />
      <file path="a3.bmp" md5="603B9635A4921C25D50844254A2B573D" />
      <file path="a4.ini" md5="9C12CC7F5C1F1F4240DA407F7E3B145E" />
    </group>
  </files>
</component>');
但您可能希望将搜索值作为sql变量参数引入

DECLARE @md5 VARCHAR(100)='0315DBA4FBEEB917F41AFF1A1BFF549B';
SELECT * 
FROM @dummy
WHERE Descriptor.exist('/component/files/group/file[@md5=sql:variable("@md5")]')=1;
如果这个MD5可以位于不同的位置,那么您可能还需要检查深度搜索

暗示
搜索XML数据将永远不会执行。。。我强烈建议-如果您更经常需要此功能,并且如果性能很重要,请使用MD5值和ROWID维护一个副表。您可以使用类似的索引。我不会走XML索引之路…

谢谢您的回答!它起作用了!:)与此同时,我记得.exist()函数,但你比我更快地找到了正确的语法!由于某种原因,我被描述符卡住了。exist('//component/files/group/file/@md5=“c7ebfc25e2a57d5c622722c970860af“)=1表单,但它适用于所有实体,而不仅仅是那些具有md5值的实体。再一次全面回答+1。还看到多瑙河结冰了。。。这一定是个罕见的事件@约翰卡佩莱蒂:嗨,是的,外面很冷。但是这些图片是误导性的。。。作为防止高水损害的措施,有以下几种。真正的多瑙河是冰冻的,但还不够滑。第二个河床是静水,夏天用来游泳,冬天经常结冰。
SELECT * 
FROM @dummy
WHERE Descriptor.exist('/component/files/group/file[@md5="0315DBA4FBEEB917F41AFF1A1BFF549B"]')=1;
DECLARE @md5 VARCHAR(100)='0315DBA4FBEEB917F41AFF1A1BFF549B';
SELECT * 
FROM @dummy
WHERE Descriptor.exist('/component/files/group/file[@md5=sql:variable("@md5")]')=1;
DECLARE @md5 VARCHAR(100)='0315DBA4FBEEB917F41AFF1A1BFF549B';
SELECT * 
FROM @dummy
WHERE Descriptor.exist('//file[@md5=sql:variable("@md5")]')=1;