none
bulk insert中文乱码 RRS feed

  • 问题

  • 遇到一个非常棘手的问题,查阅了大量资料也没能解决,还请各位老师给予解答,不胜感激:

    问题是关于在sql2008 中运行bulk insert时出现的。

    -------------------------------------------------------------------------------------------------------------------------------------------------

    1、首先先创建一张表aa:

    CREATE TABLE [dbo].[aa](
     [bill_hyh_ydh_shrq] [nvarchar](50) NULL,
     [bill_order] [nvarchar](50) NULL,
     [userinfo_id] [nvarchar](50) NULL,
     [bill_user_name] [nvarchar](50) NULL,
     [bill_goods_name] [nvarchar](50) NULL
    ) ON [PRIMARY]

    -------------------------------------------------------------------------------------------------------------------------------------------------

    2、创建一个编码类型是Unicode的txt文档text.txt(由于txt文档是程序自动生成的只能是Unicode或UTF—8):

    24181#24181#23#gf#18661859985
    24181#四方#24181#四方#24181
    济南#济南#济南#济南#济南

    -------------------------------------------------------------------------------------------------------------------------------------------------

    3、创建一个数据格式化文件itext.xml:

    <?xml version="1.0" ?>
    <BCPFORMAT  ..........>  <RECORD>
        <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="#"  COLLATION="Chinese_PRC_CI_AS"/>
        <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="#"  COLLATION="Chinese_PRC_CI_AS"/>
        <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="#"  COLLATION="Chinese_PRC_CI_AS"/>
        <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="#"  COLLATION="Chinese_PRC_CI_AS"/>
        <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\n"   />
      </RECORD>
      <ROW>
        <COLUMN SOURCE="1" NAME="bill_hyh_ydh_shrq" xsi:type="SQLNVARCHAR" />
        <COLUMN SOURCE="2" NAME="bill_order" xsi:type="SQLNVARCHAR" />
        <COLUMN SOURCE="3" NAME="userinfo_id" xsi:type="SQLNVARCHAR" />
        <COLUMN SOURCE="4" NAME="bill_user_name" xsi:type="SQLNVARCHAR" />
        <COLUMN SOURCE="5" NAME="bill_goods_name" xsi:type="SQLNVARCHAR" />
      </ROW>
    </BCPFORMAT>

    -------------------------------------------------------------------------------------------------------------------------------------------------

     4、在sql2008中运行语句(sql2005我测试可以得到正确结果,但需要设置代码页为65001。sql2008不支持代码页65001,我们系统数据库是sql2008的所以只能用sql2008):

      SELECT * FROM openrowset(
      bulk N'E:/text.txt',
      FORMATFILE = 'E:/itext.xml'
      ) AS mytb

    -------------------------------------------------------------------------------------------------------------------------------------------------

    5、得到以下结果

    锘?4181 24181 23 gf 18661859985
    24181 鍥涙柟 24181 鍥涙柟 24181
    娴庡崡 娴庡崡 娴庡崡 娴庡崡 娴庡崡

    -------------------------------------------------------------------------------------------------------------------------------------------------

    由于程序生成的大量txt里面列不一定和数据表里面的列顺序一致,所以需要用xml格式化文件指定txt里面的数据列对照。这个问题困扰了

    我们好长时间了,咨询了不少人不知道如何解决这个问题还请老师帮忙解决。至于txt文档是程序自动生成的,每天有大量生成格式只能是

    Unicode或UTF—8。

    ----在线等待解答:


    2014年9月25日 6:25

答案

  • 联机帮助上明确不支持这个代码页, 应该是要调整程序,改变文件编码,要么换用其他方法吧, 比如用 SSIS或者自己写程序
    2014年9月26日 4:32

全部回复