2013-07-26 54 views
4

我试图从存储在单个XML字段中的MS-SQL Server 2008数据库中提取四条信息。这是我第一次必须使用XML,所以我遇到了一些麻烦,这就是为什么我只有我想要提取的数据。我曾尝试使用其他帖子来解决我的问题,但显然没有运气。从MS-SQL Server 2008中的XML字段中提取值

这四个信息首先是“项目经理”,然后是“价值”,然后第二个是“利润中心”,然后是该值。 “利润中心”的值将用于在两个表之间进行连接。以下是存储在此字段中的XML数据的示例。

<ArrayOfEntityPropertyOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <EntityPropertyOfString> 
     <Name>Project Manager</Name> 
     <Value>DBD</Value> 
    </EntityPropertyOfString> 
    <EntityPropertyOfString> 
     <Name>Profit Center</Name> 
     <Value>211</Value> 
    </EntityPropertyOfString> 
    </ArrayOfEntityPropertyOfString> 

因此,在这个例子中,我需要使用“利润中心”价值“211”加入这两个表都在一个MS-SQL查询。该信息可以被称为“tblProfitCenter”的表格和持有它的字段“prftData”。

这里是一个由查询会做同样的工作,如果在“prftData”中的数据以XML是不是,反而是一个普通整数字段保持利润中心ID和进行联接。

SELECT md.LName, md.FName, pc.ProfitCenterName 
    FROM tblMainDataCenter md 
    LEFT OUTER JOIN tblProfitCenter pc ON md.pcID = pc.prftData 

这是一个项目,在我工作的地方,需要能够超越这个。通常我会学习XML来解决这个问题,但时间不会允许这样做。直到我有机会学习XML,我将不胜感激任何帮助。

回答

2

您可以使用XML列的value函数从这样的XML提取数据:

SELECT col.value('(/ArrayOfEntityPropertyOfString/EntityPropertyOfString[Name="Profit Center"]/Value)[1]', 'int') 
FROM tbl 

假设你的表名为tbl和XML列被命名为col

第一个参数是一个XPath表达式1,并且所述第二目标数据类型。请注意,这些字符串必须在SQL Server中修复字符串,并且不能动态构建e。 G。通过字符串连接。

2

下面的查询将允许您利用XML内容,并把它们放在一个表格式,这样你就可以在该表上执行必要的SQL操作:

Declare @xmlstring xml = '<ArrayOfEntityPropertyOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <EntityPropertyOfString> 
     <Name>Project Manager</Name> 
     <Value>DBD</Value> 
    </EntityPropertyOfString> 
    <EntityPropertyOfString> 
     <Name>Profit Center</Name> 
     <Value>211</Value> 
    </EntityPropertyOfString> 
    </ArrayOfEntityPropertyOfString>' 


select MainDataCenter.Col.value('(Name)[1]','varchar(max)') as Name 
,MainDataCenter.Col.value('(Value)[1]','varchar(max)') as Value 
from @xmlstring.nodes('/ArrayOfEntityPropertyOfString/EntityPropertyOfString') as MainDataCenter(Col)