*********************  导入 xml 文件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

解决方案 »

  1.   

    这样导入XML数据应该用什么样的工具呢?或者是方法?因为我的文件很大,一般的也就600K,大的有2M,所以我用XML解析类分析出数据后再以增加记录的方法的话,会很慢很慢的。可能是因为XML解析类解析的过程所用的时间很长的,我想知道我应该怎么做。    真的希望能得到帮助,谢谢了先,不管是否回答我。
      

  2.   

    --参考:
    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 </署名>
      <署名>参 谋 长: X X X </署名>
    </署名列表>
    <成文时间>19XX年X月X日X时X分于XXX</成文时间>
    <承办单位>承办单位:作训科</承办单位>
    </进攻战斗命令>
    '
    --*/
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc--第一层--父表
    SELECT * FROM OPENXML (@idoc, '/进攻战斗命令',2)
    WITH (
    发文字号 varchar(50)
    ,密级 varchar(50)
    ,发文单位标识 varchar(10)
    ,标题 varchar(50)
    ,地图和年版 varchar(50)
    ,主送单位 varchar(50)
    ,正文 varchar(10)
    ,附件 varchar(50)
    ,署名 varchar(10)
    ,成文时间 varchar(50)
    ,承办单位 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) '.'
    )--第二层--署名
    SELECT * FROM OPENXML (@idoc, '/进攻战斗命令/署名列表/署名',2)
    WITH (
    发文字号 varchar(50) '/进攻战斗命令/发文字号',
    署名 varchar(50) '.'
    )EXEC sp_xml_removedocument @idoc
      

  3.   

    --对于你的XML,就是类似下面的处理.只是查询的例子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"?>
    <LanguageSource>
    <Book>
       <type>报告文学</type>
       <author>不详</author>
       <title>不详</title>
          <context>
             <chapter>
                 <title>不详1</title>
                 <doc>不详1</doc>
             </chapter>
             <chapter>
                 <title>不详2</title>
                 <doc>不详2</doc>
             </chapter>
          </context>
    </Book>
    </LanguageSource>'
    --*/
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc--作者表:作者ID、作者名字、作者介绍
    SELECT * FROM OPENXML (@idoc, '/LanguageSource/Book',2)
    WITH (
    作者名字 varchar(50) 'author'
    )
    --类型表:类型ID、类型名
    SELECT * FROM OPENXML (@idoc, '/LanguageSource/Book',2)
    WITH (
    类型名 varchar(50) 'type'
    )--书名列表:书名ID、作者ID、类型ID、书名(也就是XML中的第一个TITLE)
    SELECT * FROM OPENXML (@idoc, '/LanguageSource/Book',2)
    WITH (
    作者ID varchar(50) 'author',
    类型ID varchar(50) 'type',
    书名 varchar(50) 'title'
    )EXEC sp_xml_removedocument @idoc
      

  4.   

    --下面是插和数据到表的处理例子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"?>
    <LanguageSource>
    <Book>
       <type>报告文学</type>
       <author>不详</author>
       <title>不详</title>
          <context>
             <chapter>
                 <title>不详1</title>
                 <doc>不详1</doc>
             </chapter>
             <chapter>
                 <title>不详2</title>
                 <doc>不详2</doc>
             </chapter>
          </context>
    </Book>
    </LanguageSource>'
    --*/
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc--创建测试的表
    create table 作者表(作者ID int identity(1,1),作者名字 varchar(50),作者介绍 varchar(50))
    create table 类型表(类型ID int identity(1,1),类型名 varchar(50))
    create table 书名列表(书名ID int identity(1,1),作者ID int,类型ID int,书名 varchar(50))--下面是数据处理
    declare @作者ID int,@类型ID int--作者表:作者ID、作者名字、作者介绍
    insert 作者表(作者名字)
    SELECT * FROM OPENXML (@idoc, '/LanguageSource/Book',2)
    WITH (
    作者名字 varchar(50) 'author'
    )
    set @作者id=@@identity--类型表:类型ID、类型名
    insert into 类型表(类型名)
    SELECT * FROM OPENXML (@idoc, '/LanguageSource/Book',2)
    WITH (
    类型名 varchar(50) 'type'
    )
    set @类型ID=@@identity--书名列表:书名ID、作者ID、类型ID、书名(也就是XML中的第一个TITLE)
    insert into 书名列表(作者ID,类型ID,书名)
    SELECT @作者ID,@类型ID,* FROM OPENXML (@idoc, '/LanguageSource/Book',2)
    WITH (
    书名 varchar(50) 'title'
    )EXEC sp_xml_removedocument @idocgo--显示处理结果
    select * from 作者表
    select * from 类型表
    select * from 书名列表--删除测试表
    drop table 作者表,类型表,书名列表
      

  5.   

    将这些SQL代码再写成一个大的存储过程吧
        再用段代码调用它,谢谢
      

  6.   

    zjcxc(邹建)兄:根据我的实际情况(我的一个XML文件是一本书,但是因为一个作者可能有多本书,这样的话,如果每读一XML文件,就会读出一作者,一类型等等),这样在导入的时候是不是SQL SERVER会自动处理 相同的作者不会增加记录。不知道我说的明白不明白
      

  7.   

    当然不是,你可以这样改下.以作者表为例declare @作者ID int,@类型ID intdeclare @作者 varchar(50)
    SELECT @作者=作者名字 FROM OPENXML (@idoc, '/LanguageSource/Book',2)
    WITH (
    作者名字 varchar(50) 'author'
    )
    select @作者id=作者id from 作者表 where 作者名字=@作者名字
    if @作者id is null
    begin
      insert into 作者表(作者名字) values(@作者名字)
      set @作者id=@@identity
    end