Как сделать SQL Query для данных XML (в SQLServer)? - PullRequest
1 голос
/ 20 сентября 2011

У меня есть простая таблица tblFiles в SQL Server 2008 R2.

tblFiles в виде следующих столбцов:

  1. FileId - (int) первичный ключ
  2. FileName - (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>

Я заполнил базу данных множеством файлов и связанных с ними метаданных.

Я пытаюсь выяснить, как написать запрос, который будет возвращать все записи с установленной в XML длиной, равной X и Y?

Как мнеперемещаться по XML в запросе SQL?

TIA

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Я проверил это на вашем 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

0 голосов
/ 20 сентября 2011

Это из памяти, поэтому мой синтаксис может быть немного не в порядке. Это должно быть примерно так:

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 вопросов по этой теме:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...