2011-09-20 58 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