2011-06-01 110 views
2

我已经编写了一个接口与CubeIQ BlackBox(www.magiclogic.com)进行交互,并且我有一个SQL Server 2005数据库表,其中存储了一些常规文本字段,日期和具有XML数据类型的列中的两段XML。从存储在XML数据类型中的XML查询属性和节点值

我想从XML中挑出一些值,但我无法弄清楚如何查询XML或该XML内节点的属性。

这里是我想要做的查询类型:

SELECT 
    [regular_table_field1], 
    [regular_table_field2], 
    [opt_resposne_xml][email protected]('someattribute') AS 'someattribute', 
    [opt_resposne_xml][email protected]('someattribute2') AS 'someattribute2' 
FROM [optimizations] WHERE [opt_concept_id] = '1234' 

回答

2

不知道你的XML是什么样子,这里有一个通用的代码给你的将是什么样子的想法:

SELECT 
    [regular_table_field1], 
    [regular_table_field2], 
    [opt_resposne_xml].value('(/rootnode/wrapper/child/@someattribute)[1]', 'int') AS 'someattribute', 
    [opt_resposne_xml].value('(/rootnode/wrapper/child/@someattribute2)[1]', 'varchar(50)') AS 'someattribute2' 
FROM 
    [optimizations] 
WHERE 
    [opt_concept_id] = '1234' 

如果您需要“到达”XML列并获取单个值(来自XML元素或属性),则基本上需要将XPath定义为您感兴趣的信息位置in位于,并且您需要将其转换为给定的SQL Server数据类型。

如果您需要将单个关系行交叉连接到来自单个XML字段的多个元素,则可能需要其他方法(CROSS APPLY)。

另外:您可能需要注意涉及的XML名称空间 - 尝试解析SQL Server中的XML时常见的错误。

+0

非常感谢你。我找到了解释过程如何工作但无法使查询正常工作的语法的MSDN文章。你能解释一下为什么你必须把XPath查询放在(parens)中,为什么最后有一个[1]?这是在一组节点中指定该属性的第一个,第二个第三个等外观的方式吗? – DirtyBirdNJ 2011-06-01 20:42:16

+0

为什么选择parens?我不知道 - 你得问问定义这一点的微软设计师。 '[1]'表示第一次出现 - 如果您想将其转换为单个数据值,则需要确保它只是返回一个XML节点/属性。是的 - 你也可以使用'[2]'获得第二个 - 但要小心,以确保有第二个.... – 2011-06-01 20:43:49

+0

我实际上是在试图看看它会如何工作......如果我离开[1]我得到一个错误......因为没有[2]它会返回NULL,如果我使用它。我基本上是写这个完全相同的查询,但没有额外的parens和括号内的索引指标。 – DirtyBirdNJ 2011-06-01 20:51:03