2010-06-17 77 views
2

我想從SQL Server 2005 XML數據類型中選擇一些基於位於子節點中的最大數據的值。根據子元素的最大值在SQL Server中選擇一個XML節點

我有XML類似以下內容存儲在一個領域在SQL Server中多行:

<user> 
    <name>Joe</name> 
     <token> 
     <id>ABC123</id> 
     <endDate>2013-06-16 18:48:50.111</endDate> 
     </token> 
     <token> 
     <id>XYX456</id> 
     <endDate>2014-01-01 18:48:50.111</endDate> 
     </token> 
</user> 

我想從這個XML列進行選擇在此它確定令牌元素中的最大日期將返回類似下面每個記錄的結果數據行:

喬XYZ456 2014年1月1日18 :48:50.111

我試圖找到一個最大的xpath函數,所有我會選擇正確的標記元素,但我找不到一個會工作。

我也嘗試使用SQL MAX函數,但是我無法使用該方法得到它。

如果我只有一個令牌,它當然可以正常工作,但是當我有多個時,我得到一個NULL,很可能是因爲查詢不知道要提取哪個日期。我希望有一種方法可以在令牌元素上指定where子句[max(endDate)],但還沒有找到一種方法來實現這一點。

這裏是工作的時候我只有一個令牌的一個示例:

SELECT 
XMLCOL.query('user/name').value('.','NVARCHAR(20)') as name 
XMLCOL.query('user/token/id').value('.','NVARCHAR(20)') as id 
XMLCOL.query('user/token/endDate').value(,'xs:datetime(.)','DATETIME') as endDate 
FROM MYTABLE 

回答

3

如何:

SELECT 
    TOP 1 
    XMLCOL.value('(/user/name)[1]', 'nvarchar(20)') as 'UserName', 
    Usr.Token.value('(id)[1]', 'nvarchar(20)') AS 'ID', 
    Usr.Token.value('(endDate)[1]', 'DateTime') as 'EndDate' 
FROM 
    dbo.MyTable 
CROSS APPLY 
    xmlcol.nodes('/user/token') AS Usr(Token) 
ORDER BY 
    Usr.Token.value('(endDate)[1]', 'DateTime') DESC 

你基本上採取類似「用戶名「原子」的一部分',然後交叉應用/ user/token列表並提取您想要的各個位 - 您將得到包含三列(UserName,ID,EndDate)的結果集,然後您可以對其進行排序和過濾。

邊注:不是這樣的:

XMLCOL.query('user/name').value('.','NVARCHAR(20)') 

你爲什麼不使用 - 感覺更容易!

XMLCOL.value('(/user/name)[1]', 'NVARCHAR(20)') 
+0

CROSS APPLY做到了。這不正是我所需要的,但你指出了我的正確方向。謝謝。 – Jay 2010-06-18 16:14:24

相關問題