2012-09-12 102 views
0

Getting xml data stored in a varchar out of SQL類似,我需要從存儲在VARCHAR列中的XML字符串提取一個值。SQL Server 2000 - 從存儲在VARCHAR中的XML中提取數據

但是,數據位於SQL Server 2000上,因此不能使用XML類型。

這在SQL Server 2000中可能嗎?

例如以下XML,我怎麼能在<status>節點中選擇值:

<entities> 
    <entity> 
     <name>foo</name> 
     <status>1</status> 
    </entity> 
    <entity> 
     <name>bar</name> 
     <status>2</status> 
    </entity> 
</entities> 

回答

2

試試這個:

declare @xml varchar(1000) 
SET @xml='<entities> 
    <entity> 
     <name>foo</name> 
     <status>1</status> 
    </entity> 
    <entity> 
     <name>bar</name> 
     <status>2</status> 
    </entity> 
</entities>' 
select @xml,SUBSTRING(@xml,CHARINDEX('<status>',@xml)+LEN('<status>'),(CHARINDEX('</status>',@xml)-(CHARINDEX('<status>',@xml)+LEN('<status>')))) 
+0

這正是我剛剛通過自己的解決方案! – Shevek

+0

我認爲它應該是'-LEN('')'不是'+ LEN('')'長度參數 – Shevek

+0

它給你正確的狀態標記值,因爲ii已經在我的機器上測試過 – AnandPhadke

1

你可以使用OPENXML;將文檔中的示例適用於特定情況應該不會太困難。

1

我覺得OpenXML的有關問題的最佳解決方案。

DECLARE @xml VARCHAR(2000) 
SET @xml = N' 
<entities> 
    <entity> 
     <name statue="1">foo</name> 
     <status>1</status> 
    </entity> 
    <entity> 
     <name statue="2">bar</name> 
     <status>2</status> 
    </entity> 
</entities> 
' 

DECLARE @docHandle int 
EXEC sp_xml_preparedocument @docHandle OUTPUT, @xml 


SELECT * 
    FROM OPENXML(@docHandle, N'/entities/entity',2) 
WITH (name VARCHAR(20), status INT) 
+0

我必須在WITH()子句中聲明每個節點?我的真實數據中還有很多比這個樣本更多。 – Shevek

+0

據我所知你應該提及節點名稱。這與在表中定義字段相同。 – Pradeeshnarayan

+0

對不起,我應該更具體 - XML中有9個節點,但我只想提取其中的2個 - 我是否需要聲明全部9個或僅僅是我想要的2個? – Shevek