Sql server 从存储在XML数据类型中的XML查询属性和节点值

Sql server 从存储在XML数据类型中的XML查询属性和节点值,sql-server,xml,tsql,Sql Server,Xml,Tsql,我已经编写了一个与CubeIQ BlackBox(www.magiclogic.com)交互的接口,并且我有一个SQL Server 2005数据库表,在其中我存储了一些常规文本字段、日期和两段XML,并将它们存储在具有XML数据类型的列中 我想从XML中挑选一些值,但我不知道如何查询XML或XML中节点的属性 以下是我要执行的查询类型: SELECT [regular_table_field1], [regular_table_field2], [opt_respo

我已经编写了一个与CubeIQ BlackBox(www.magiclogic.com)交互的接口,并且我有一个SQL Server 2005数据库表,在其中我存储了一些常规文本字段、日期和两段XML,并将它们存储在具有XML数据类型的列中

我想从XML中挑选一些值,但我不知道如何查询XML或XML中节点的属性

以下是我要执行的查询类型:

 SELECT 
    [regular_table_field1],
    [regular_table_field2],
    [opt_resposne_xml].rootnode.wrapper.child@attr('someattribute') AS 'someattribute',
    [opt_resposne_xml].rootnode.wrapper.child@attr('someattribute2') AS 'someattribute2'
 FROM [optimizations] WHERE [opt_concept_id] = '1234'

不知道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,将其指向感兴趣的信息所在的位置,并且需要将其转换为给定的SQL Server数据类型

如果需要将单个关系行与单个XML字段中的多个元素交叉连接,则可能需要其他方法(
cross-APPLY


另外:您可能需要注意所涉及的XML名称空间,这是在SQL Server内部解析XML时常见的一个陷阱。

非常感谢。我找到了一些MSDN文章,这些文章解释了这个过程是如何工作的,但却无法让查询的语法正常工作。您能解释一下为什么必须将XPath查询放在(parens)中,以及为什么在它的末尾有一个[1]吗?这是指定该属性在一组节点中的第一个、第二个、第三个等外观的方法吗?为什么是parens?我不知道——你得问问定义这个的微软设计师。
[1]
表示第一次出现-如果要将其转换为单个数据值,需要确保它只是返回的单个XML节点/属性。是的-你也可以使用
[2]
来获得第二个-但是要小心,确保还有第二个…我实际上是在尝试这个,看看它是如何工作的。。。如果我关闭[1],我会得到一个错误。。。因为没有[2],如果我使用它,它将返回NULL。我基本上写的是完全相同的查询,但没有额外的参数和括号内的索引指示器。