2011-09-20 73 views
1

我有一个SQL Server 2008 R2中称为tblFiles的简单表。如何为XML数据执行SQL查询(在SQLServer中)?

tblFiles如以下列:

  1. FILEID - (int)的主键
  2. 文件名 - (nvarchar的255)
  3. 元数据 - (XML)已被配置为与一个XML模式用于 验证。

的模式如下:

<?xml version="1.0" encoding="UTF-16"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="FileMetaData"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="CreatedDate" type="xs:time"/> 
       <xs:element name="ModifiedDate" type="xs:time"/> 
       <xs:element name="AccessDate" type="xs:time"/> 
      </xs:sequence> 
      <xs:attribute name="Length" type="xs:integer"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

记录中的一个示例XML元数据条目是:

<?xml version="1.0"?> 
<FileMetaData Length="26"> 
    <CreatedDate>10:13:53.1008</CreatedDate> 
    <ModifiedDate>10:14:02.0327</ModifiedDate> 
    <AccessDate>10:13:53.1008</AccessDate> 
</FileMetaData> 

我填充数据库文件的负载及其关联元数据。

我想解决的是如何编写一个查询,该查询将返回在X和Y之间的XML中设置了长度的所有记录?

如何导航SQL查询中的XML?

TIA

回答

3

我测试了你的XML :

SELECT MyXmlCol.value('(/FileMetaData/@Length)[1]', 'int') 
FROM MyXmlTable 
WHERE MyXmlCol.value('(/FileMetaData/@Length)[1]', 'int') BETWEEN 25 AND 30 

输出:

26 

你要记住[1]告诉查询抢到第一个值。 “@”指定一个XML属性。您可以检查出的值()函数这里的文档:

http://msdn.microsoft.com/en-us/library/ms178030.aspx

+0

我设法找出另一种方式来做到这一点使用以及查询: SELECT的fileid,文件名,元数据 从文件中 WHERE MetaData.exist('/ FileMetaData [@Length> 25]')= 1 AND MetaData.exist('/ FileMetaData [@Length <30]')= 1 我已经尝试了这两种方法,但我列在这里的有很多更好的性能(顺便说一下,我在MetaData列上有一个XML索引)。 – millie