如何对XML数据进行SQL查询(在SQLServer中)?

时间:2011-09-20 10:32:59

标签: sql xml sql-server-2008 xsd sql-server-2008-r2

我在SQL Server 2008 R2中有一个名为tblFiles的简单表。

tblFiles如下列:

  1. FileId - (int)主键
  2. FileName - (nvarchar 255)
  3. MetaData - (xml)已配置XML架构 验证。
  4. 架构如下:

    <?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

2 个答案:

答案 0 :(得分: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属性。你可以在这里查看关于value()函数的文档:

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

答案 1 :(得分:0)

这是来自内存,所以我的语法可能有点过了。它应该是这样的:

declare @x int
declare @y int

set @x = 10
set @y = 50

select *
from tblFiles
where MetaData.value('(/FileMetaData/@Length)', 'int') between @x and @y

关于这类话题还有很多其他的SO问题: