6

我正在尝试从存储在单个 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 之前,我将不胜感激。

4

2 回答 2

4

您可以使用valueXML 列上的函数从 XML 中提取数据,如下所示:

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

假设您的表被命名tbl并且 XML 列被命名col

第一个参数是 XPath 1 表达式,第二个参数是目标数据类型。请注意,这些字符串必须是 SQL Server 中的固定字符串,并且不能动态构建,例如通过字符串连接。

于 2013-07-26T12:57:14.043 回答
3

以下查询将允许您获取 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)
于 2013-07-26T13:02:53.070 回答