2015-08-14 65 views
0

嗨我現在在這裏我的代碼,我沒有得到正確使用此代碼的結果;如何提取xml字符串以使用XQuery/XPath在sql中創建新列?

Declare @txt varchar(max) = (
    select audit_val from AuditTable 
    where audit_val like '%update_dt%' 
    and audit_val like '%PEK150700019-001%') 

Declare @xml XML = CONVERT(XML,@txt) 

SELECT 
    @xml.value('(/i/@guest_id)[1]', 'varchar(100)') as guest_id 
    , @xml.value('(/i/@updated_by)[1]', 'varchar(100)') as updated_by 
    , @xml.value('(/i/@update_dt)[1]', 'datetime') as update_dt 

我所得到的是空值,而且它說,它不止一個值, 使用SELECT TOP 1會做退回,但我需要提取所有從表中的行需要在該列的字符串,有人可以幫我解決這個問題嗎?在此先感謝:)

注意**繼承人樣本輸出;

================================================================= 
|guest_id   | updated_by  |  update_dt   | 
|==================|==================|=========================| 
|PEK150700019-001 | sherwin   | 2015-08-11T13:59:09.550| 
|------------------|------------------|-------------------------| 
+0

「返回多個值」 可能是你的第一個部分,在那裏你設置'@ txt'。在這裏放置一個ORDER BY和TOP 1。在提出任何問題之前,您應該確定錯誤的實際位置。 –

回答

0

這是一種可能的方式:

declare @auditTable TABLE(audit_val varchar(1000)) 
insert into @auditTable values('<i guest_id="PEK150700019-001" updated_by="sherwin" update_dt="2015-08-11T13:59:09.550" place_birth="SHANGHAI"/>') 

select 
    (CONVERT(XML,audit_val)).value('(/i/@guest_id)[1]', 'varchar(100)') as guest_id 
    , (CONVERT(XML,audit_val)).value('(/i/@updated_by)[1]', 'varchar(100)') as updated_by 
    , (CONVERT(XML,audit_val)).value('(/i/@update_dt)[1]', 'datetime') as update_dt 
from @auditTable 
where audit_val like '%update_dt%' 
     and audit_val like '%PEK150700019-001%' 

Sqlfiddle Demo

使用在存儲XML數據首位XML數據類型。這樣可以避免必須多次執行將varchar轉換爲XML以提高查詢性能。

輸出:

|   guest_id | updated_by |    update_dt | 
|------------------|------------|--------------------------| 
| PEK150700019-001 | sherwin | August, 11 2015 13:59:09 | 
+0

@Wane如果你可以提供一個你正在處理的實際XML的代表性例子,那將允許人們在第一個鏡頭時給出最合適的建議:) – har07

+0

這沒有幫助。我以前的評論只是說,如果你的實際XML有多個元素,那麼你應該提供一個包含多個元素的例子。 – har07

+0

我剛纔意識到我說的是無稽之談:D非常感謝幫助:)你是最棒的!非常感謝 !! – Wane

相關問題