忘了说明了,想用DTS,程序我用.net已经实现了,就是效率太慢.

解决方案 »

  1.   

    在前台处理,一般语言都有处理XML文档的控件,很方便的就可以导入了.
      

  2.   

    DECLARE @idoc int
    DECLARE @doc varchar(1000)
    --sample XML document
    SET @doc ='
    <root>
      <Customer cid= "C1" name="Janine" city="Issaquah">
          <Order oid="O1" date="1/20/1996" amount="3.5" />
          <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
          </Order>
       </Customer>
       <Customer cid="C2" name="Ursula" city="Oelde" >
          <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue 
                 white red">
                <Urgency>Important</Urgency>
                Happy Customer.
          </Order>
          <Order oid="O4" date="1/20/1996" amount="10000"/>
       </Customer>
    </root>
    '
    -- Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc-- Execute a SELECT statement using OPENXML rowset provider.
    SELECT *
    FROM OPENXML (@idoc, '/root/Customer/Order', 1)
          WITH (oid     char(5), 
                amount  float, 
                comment ntext 'text()')
    EXEC sp_xml_removedocument @idoc???????
      

  3.   

    如果内容不多,可以用下面的方法
    DECLARE @idoc int,@doc varchar(8000)--从文件中读出XML内容到临时表
    create table #tb (doc varchar(8000))
    bulk insert #tb from 'c:\a.xml'--将读取到的数据保存到变量中
    set @doc=''
    select @doc=@doc+doc from #tb--删除临时表
    drop table #tb/*下面是从文件中读取的内容
    SET @doc ='
    <?xml version=''1.0'' encoding="gb2312"?>
    <进攻战斗命令>
    <发文字号>19XX司作字第X号</发文字号>
    <密级>X密</密级>
    <发文单位标识>
     <中国人民>中国人民</中国人民>
     <解放军>解放军</解放军>
     <标识>摩托化步兵第X师(命令)</标识>
    </发文单位标识>
    <标题>XX地区进攻战斗</标题>
    <地图和年版>地图1:30万  19xx年版</地图和年版>
    <主送单位>各团,集团军坦克师第1团、炮兵旅</主送单位>
    <正文>
      <段落>一,敌摩托化步兵第*师孤军冒进,进攻受阻,被迫于*月*日*时在**地区转入防御。(具体部署见敌情通报)。</段落>
      <段落>二,集团军首长决心集中主要兵力兵器在**(**,**)至**(**,**)地段实施主要突破,向***(**,**)、**(**,**)、**(**,**)方向实施主要突击。首先歼灭**(**,**)、**(**,**)地域之敌,尔后歼灭**(**,**)、**(**,**)地域之敌,再向**(**,**)、**(**,**)方向发展进攻。</段落>
      <段落>三,师基本指挥所、预备指挥所、后方指挥所于*日*时*分前分别在**(**,**)、**(**,**)、**(**,**)开设完毕。</段落>
    </正文>
    <附件>附:摩托化步兵第X师行军计划(略)</附件>
    <署名>师 长 : X X X </署名> 
    <署名>政治委员: X X X </署名>
    <署名1>参 谋 长: X X X</署名1>
    <成文时间>19XX年X月X日X时X分于XXX</成文时间>
    <承办单位>承办单位:作训科</承办单位>
    </进攻战斗命令>
    '
    --*/
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc--第一层
    SELECT * FROM OPENXML (@idoc, '/进攻战斗命令',2)
    WITH (
    发文字号 varchar(50),
    密级 varchar(50),
    标题 varchar(500),
    地图和年版 varchar(500),
    主送单位 varchar(50),
    附件 varchar(500),
    署名 varchar(50),
    署名1 varchar(50),
    成文时间 varchar(24),
    承办单位 varchar(50)
    )--第二层--发文单位标识
    SELECT * FROM OPENXML (@idoc, '/进攻战斗命令/发文单位标识',2)
    WITH (
    发文字号 varchar(50) '../发文字号',
    中国人民 varchar(100),
    解放军 varchar(100),
    标识 varchar(50)
    )--第二层--正文
    SELECT * FROM OPENXML (@idoc, '/进攻战斗命令/正文/段落',2)
    WITH (
    发文字号 varchar(50) '/进攻战斗命令/发文字号',
    段落 varchar(8000) '.'
    )EXEC sp_xml_removedocument @idoc
      

  4.   

    如果记录太长的话,只能在前台处理啦,因为SQL不支持定义text类型的变量
    只能在存储过程中定义text类型的参数,所以需要前台传入数据,写存储过程来处理.--对于上面的例子,创建一个存储过程来处理
    create proc p_xml @doc text
    as
    declare @idoc int
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
    SELECT * FROM OPENXML (@idoc, '/进攻战斗命令',2)
    WITH (
    发文字号 varchar(50),
    密级 varchar(50),
    标题 varchar(500),
    地图和年版 varchar(500),
    主送单位 varchar(50),
    附件 varchar(500),
    署名 varchar(50),
    署名1 varchar(50),
    成文时间 varchar(24),
    承办单位 varchar(50)
    )
    ...其他处理
    go
    --然后在前参调用这个存储过程来处理就行了.
      

  5.   


    public function Saved(xmldoc)
    dim lab_id, lab_num, lab_code, lab_name
    dim nodeItem
    dim db set db=server.CreateObject("adodb.command")
    db.ActiveConnection = private_connstr
    db.CommandType=4
    db.CommandText="Save_p_clnc_lab"
    set clnc_lab_doc = xmldoc
    set nodes = clnc_lab_doc.selectNodes("//p_lab") for i=0 to nodes.length-1
    set nodeItem=nodes.item(i)
    lab_id  = nodeItem.getAttribute("lab_id")
    lab_num  = nodeItem.getAttribute("lab_num")
    lab_code = nodeItem.getAttribute("lab_code")
    lab_name = nodeItem.getAttribute("lab_name")
    db.Parameters.append db.CreateParamete("@returnvalue",adInteger,adParamReturnValue,4)
    db.Parameters.append db.CreateParameter("@lab_id",adInteger,adParamInput,4,lab_id)
    db.Parameters.append db.CreateParameter("@lab_num",adVarChar,adParamInput,8,lab_num)
    db.Parameters.append db.CreateParameter("@lab_code",adVarChar,adParamInput,8,lab_code)
    db.Execute 
    next本例所用xml结构如下:
    <root>
        <p_lab lab_id="" lab_num="" lab_code="" lab_name="" />
    </root>"Save_p_clnc_lab"为存储过程
      

  6.   

    如果xml结构为多层,代码的循环也相应为多层
      

  7.   

    DECLARE @idoc int,@doc varchar(8000)SET @doc ='
    <?xml version="1.0" encoding="GB2312"?>
    <电子病历>
       <病案 num="1">
          <姓名>梁景</姓名>
          <性别>女</性别>
          <出生日期>1985-7-12</出生日期>
          <婚姻>已婚</婚姻>
          <职业>工人</职业>
        </病案>
        <病案 num="2">
          <姓名>张路</姓名>
          <性别>女</性别>
          <出生日期>1985-7-12</出生日期>
          <婚姻>已婚</婚姻>
          <职业>工人</职业>
        </病案>
        <病案 num="3">
          <姓名>何江</姓名>
          <性别>男</性别>
          <出生日期>1985-7-12</出生日期>
          <婚姻>已婚</婚姻>
          <职业>工人</职业>
        </病案>
    </电子病历>
    'EXEC sp_xml_preparedocument @idoc OUTPUT, @docSELECT * FROM OPENXML (@idoc, '/电子病历/病案',2)
    WITH (姓名 varchar(20)
    ,性别 varchar(2)
    ,出生日期 datetime
    ,婚姻 varchar(10)
    ,职业 varchar(50)
    )