昂捷论坛≡零售最前线≡□-技术研讨会 → xml转换为关系数据


  共有24099人关注过本帖树形打印

主题:xml转换为关系数据

帅哥哟,离线,有人找我吗?
netsnopy
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:昂捷团队↑ 帖子:65 积分:1040 威望:0 精华:1 注册:2009/8/8 8:02:57
xml转换为关系数据  发帖心情 Post By:2009/12/13 10:38:54

在学习自定义表单的过程中,增加表格域后,我们如何把表格中的数据取出来的?
c_data是xml类型的字段,所以表单域的所有值都在xml序列中,
无论query还是value返回的只是一个值,不能返回多值。那么如何像查询关系型数据一样,
返回xml序列中多个同名元素节点的内容呢。如:
<rows>
  <row>
    <e_vend>多个供应商</e_vend>
    <c_user />
    <eform_s_user>0000</eform_s_user>
    <e_dt>
      <drows>
        <drow>
          <v_tel>asdf</v_tel>
          <v_add>asdf</v_add>
          <v_name>asdfasd</v_name>
        </drow>
        <drow>
          <v_tel>电话2</v_tel>
          <v_add>第二个供应商的地址</v_add>
          <v_name>第二个供应商</v_name>
        </drow>
        <drow>
          <v_tel>电话3</v_tel>
          <v_add>第三个供应商的地址</v_add>
          <v_name>第三个供应商</v_name>
        </drow>
      </drows>
    </e_dt>
  </row>
</rows>
如何像取关系型数据一样,返回供应商名称、电话、地址三个字段的值。
在这里使用nodes()表值函数 和Apply 运算符来实现。APPLY 有两种形式:CROSS APPLY
和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。
OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。
对于nodes()和apply还么有看的很明白,但是给我们提供了解决问题的方法,方法如下:
select T2.aa.query('.').value('(/drow/v_name)[1]','nvarchar(100)') as 供应商名称,
T2.aa.query('.').value('(/drow/v_tel)[1]','nvarchar(100)') as 供应商电话,
T2.aa.query('.').value('(/drow/v_add)[1]','nvarchar(100)') as 供应商地址
from tbc_eform_data
cross APPLY c_data.nodes('for $i in /rows/row/e_dt/drows/drow where $i/v_name!="" return $i' ) as T2(aa)
where c_guid='B71DC77C-6617-4743-B6AB-5E534970FB80'

这样对于自定义表单,可在审批后,通过执行sql脚本吧自定义表单的内容放置的数据库中,如采购员发起的供应商审批,可以在审批后把多个供应商信息或者合同信息按规则保存到系统中,省掉再录入一次供应商或者合同的过程,实现流程审批与业务系统自动化结合。

[此贴子已经被作者于2009-12-16 11:08:10编辑过]

使用IE9无法添加附件的解决方法 支持(0中立(0反对(0回到顶部
帅哥哟,离线,有人找我吗?
wangxiaoxiao
  2楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:昂捷团队↑ 帖子:66 积分:1669 威望:0 精华:0 注册:2008/6/4 12:42:29
  发帖心情 Post By:2009/12/13 10:54:35

试一下。


使用IE9无法添加附件的解决方法 支持(0中立(0反对(0回到顶部