2012-09-12 101 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