Chinaunix首页 | 论坛 | 博客
  • 博客访问: 756131
  • 博文数量: 128
  • 博客积分: 7079
  • 博客等级: 少将
  • 技术积分: 1326
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-16 08:53
文章分类

全部博文(128)

文章存档

2011年(3)

2010年(12)

2009年(9)

2008年(23)

2007年(61)

2006年(20)

我的朋友

分类: 数据库开发技术

2006-10-12 12:03:45

openxml 函数 [字符串]


 

从 xml 文档生成一个结果集。

 

openxml ( xml-expression,
 xpath-query [, flags [, namespace-declaration ] ] )
with ( column-name column-type [ xpath-query ],... )

 

xml-expression    生成结果集所基于的 xml 文档。可以是任意的字符串表达式,如常量、变量或列。

xpath-query    包含 xpath 查询的字符串。xpath 允许您指定描述要查询的 xml 文档的模式。该参数中包含的 xpath 模式将从 xml 文档中选择节点。每个与出现在第二个 xpath-query 参数中的 xpath 查询相匹配的节点都将在表中生成一行记录。

元属性只能在 with 子句的 xpath-query 参数中指定。一个元属性可在 xpath 查询中作为一个属性来访问。如果不指定 namespace-declaration,则缺省情况下将前缀 mp 绑定到统一资源定位符 (uri) urn:ianywhere-com:asa-xpath-metaprop。如果指定了一个 namespace-declaration,则该 uri 必须绑定到 mp 或其它的前缀以便能访问查询中的元属性。openxml 支持下列元属性:

  • @mp:id    返回一个节点在 xml 文档中唯一的 id。当数据库服务器重新启动后,给定文档中给定节点的 id 可能会更改。该元属性的值按文档的顺序递增。

  • @mp:localname    返回节点名称中的本地部分,如果该节点没有名称则返回 null。

  • @mp:prefix    返回节点名称中的前缀部分,如果该节点没有名称或没有前缀则返回 null。

  • @mp:namespaceuri    返回该节点所属的命名空间的 uri,如果该节点不在命名空间中则返回 null。

  • @mp:xmltext    以 xml 形式返回 xml 文档的子树。例如,当匹配了一个内部节点时,可使用该元属性来返回一个 xml 字符串,而不再是下级文本节点的连接值。

flags    当 with 子句中没有指定 xpath 查询时,标识在 xml 数据和结果集之间所使用的映射。如果没有指定 flags 参数,则缺省的行为是将属性映射到结果集中的列。flags 参数可为下列值之一:

说明
1 将 xml 属性映射到结果集中的列(缺省)。
2 将 xml 元素映射到结果集中的列。

namespace-declaration    一个 xml 文档。查询的作用域命名空间取自该文档的根元素。如果指定命名空间,则必须给出一个 flags 参数,即使已指定了所有的 xpath-query 参数。

with 子句    指定结果集的模式及如何在结果集中查找每一列的值。with 子句的 xpath-query 参数根据第二个语句的xpath-query 进行匹配。如果 with 子句表达式匹配多个节点,则只有文档中的第一个节点被使用。如果该节点不是文本节点,则通过附加所有下级文本节点来获得结果。如果一个 with 子句表达式不与任何节点匹配,则该行的列为 null。

openxml with 子句的语法与从存储过程中进行选择的语法类似。

column-name    结果集中列的名称。

column-type    结果集中列的数据类型。该数据类型必须与从 xml 文档中选择的值相兼容。

 

openxml 分析 xml-expression 并将结果采用树的形式建模。每个元素、属性、文本节点和其它 xml 构造在树中都有单独的节点。提供给 openxml 函数的 xpath 查询用来从树中选择节点,然后所选择的节点被映射到结果集中。

openxml 所使用的 xml 分析器是非校验的,该分析器不读取外部 dtd 子集或外部参数实体。

当出现列表达式的多个匹配时,使用按照文档中的顺序(被分析之前的原始 xml 文档的顺序)的第一个匹配。如果没有匹配的节点,则返回 null。当选择了一个内部节点时,返回结果为内部节点的所有下级文本节点的连接值。

类型为 binary、long binary、image 和 varbinary 的列被假定采用 base64 编码格式并自动进行解码。对于使用 for xml 子句生成的 xml,上述类型的数据为 base64 编码并且可以通过 openxml 来将其解码。

openxml 支持下列的 xpath 语法的子集:

  • 完全支持 child、self、attribute、descendant、descendant-or-self 和 parent axes 语法。

  • 在所有支持的功能中均可使用缩写的和未缩写形式的语法。例如,'a''child::a' 等价,'..''parent::node()' 等价。

  • 在名称测试中可使用通配符。例如,'a/*/b'

  • 支持下列类型测试:node()、text()、processing-instruction() 和 comment()。

  • 可使用 expr1[expr2]expr1[expr2="string"] 形式的限定符,其中 expr2 为所支持的任意 xpath 表达式。如果 expr2 匹配一个或多个节点,则限定符的值为 true。例如,'a[b]' 查找至少一个 b 子节点的 a 节点,而 a[b="i"] 查找具有至少一个文本值为 ib 子节点的 a 节点。

有关 xpath 查询语言的信息,请参见

 
  • sybase    不受 adaptive server enterprise 支持。

 

下列查询从作为 openxml 函数的第一个参数提供的 xml 文档中生成结果集:

select * from openxml( '
                 tee shirt
                 baseball cap
                 ',
                 '/products/prod_type' )
with ( prod_name long varchar 'text()', prod_id char(3) '@id')

此查询会生成以下结果:

prod_name prod_id
tee shirt 301
baseball cap 401

下列查询使用一个相等谓词来从所提供的 xml 文档中生成结果集。

select * from openxml ('
   
      105
      matthew
      cobb
      7 pleasant street
      grimsby
      ut
      02154
      6175553840
   
   
      148
      julie
      jordan
      1244 great plain avenue
      woodbridge
      az
      01890
      6175557835
   
   
      160
      robert
      breault
      358 cherry street
      milton
      pa
      02186
      6175553099
   
   
      243
      natasha
      shishov
      151 milk street
      grimsby
      ut
      02154
      6175552755
   
', '/emp_directory/employee')
with ( emp_id int 'column[@name="emp_id"]',
       first_name            char(20) 'column[@name="emp_fname"]',
       last_name               char(20) 'column[@name="emp_lname"]',
       phone_number      char(10) 'column[@name="phone"]')

此查询生成以下结果集:

emp_id first_name last_name phone_number
105 matthew cobb 6175553840
148 julie jordan 6175557835
160 robert breault 6175553099
243 natasha shishov 6175552755
阅读(2904) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~