批量插入俄语&其他国际字符到SQL Server 2008

时间:2015-06-17 22:57:16

标签: database excel sql-server-2008 import

当我在制表符分隔文件(从UNIX SAP系统导出)上使用批量插入到SQL Server 2008 R2时,Short_text字段会变成象形文字,如果它们是俄语等扩展字符。

我的代码是:

    BULK INSERT ProcureDB.dbo.tbl_SAP_PO_Load
    FROM \\Path\'Bulk_Insert_test.txt'
    WITH
    (
       FIELDTERMINATOR = '\t'
      ,FIRSTROW=2
      ,ROWTERMINATOR = '0x0a')

这是短文本字段的外观:

Short_Text
стаканы одноразовые                                                                                                                 
чай черный                                                                                                                          
Dell 22" Touch screen                                                                                                                   
Dell 3 yr advanced exchange svc

前两行是俄语。如果我使用文本导入向导将其导入Excel,它默认使用代码页65001(65001:Unicode(UTF-8),俄语文本在Excel表单中显示为OK

Short_Text (in excel sheet)
стаканы одноразовые                                                                                                                 
чай черный                                                                                                                          
Dell 22" Touch screen                                                                                                                   
Dell 3 yr advanced exchange svc 

网上的一项建议是在批量插入中使用Code-page 65001。

因此代码:

    BULK INSERT ProcureDB.dbo.tbl_SAP_PO_Load
    FROM \\Path\'Bulk_Insert_test.txt'
    WITH
    (
       **CODEPAGE = '65001'**
      ,FIELDTERMINATOR = '\t'
      ,FIRSTROW=2
      ,ROWTERMINATOR = '0x0a')

然而,这会产生错误:

  

Msg 2775,Level 16,State 13,Line 3
  服务器不支持代码页65001。

如何让服务器支持代码页65001?

另一个建议是使用CODEPAGE =' ACP'。然而,这是有效的,俄罗斯字符已被破坏,但以不同的方式。

Short_Text
Ñтаканы одноразовые                                                                                                                 
чай черный                                                                                                                          
Dell 22" Touch screen                                                                                                                   
Dell 3 yr advanced exchange svc    

版本信息。如下:

  • Microsoft SQL Server标准版(64位)10.50.6000.34
  • Microsoft Windows NT 6.1(7601)NT x64
  • 英语(美国)
  • SQL_Latin1_General_CP1_CI_AS

1 个答案:

答案 0 :(得分:-1)

当我遇到同样的问题时,我创建了自己的解决方法。我导入的UTF-8文本文件是由另一个应用程序创建/更新的,因此我无法更改文件格式。

  1. 我的数据库有排序Cyrillic_General_CI_AS
  2. 包含俄语的所有列都声明为nchar()nvarchar()
  3. BULK INSERT我的制表符分隔文本文件到临时表:

    截断表tempTable 批量插入tempTable来自' C:\ Users ... \ MyFile.txt'     with(DATAFILETYPE =' char',FIELDTERMINATOR =' \ t',         FIRSTROW = 2,CODEPAGE = 1251)

  4. 结果,我得到的字段看起来像这样:

    АБВГДЕЁЖЗРЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯР
    
    1. 为了解码,我创建了一个表和一个函数:

      declare @Codes char(200), @Letters char(100)
      if exists(select * from sys.objects where name = 'bDecode') 
      drop table bDecode
      create table bDecode(Code nvarchar(2), Letter nvarchar(1))
      set @Codes = 
      'АБВГДЕЁЖЗРЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
      set @Letters = 
      'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
      declare @i int set @i = 1 while @i <= len(@Letters) 
      begin
          insert into bDecode(Code, Letter) 
          select  substring(@Codes, @i * 2 - 1, 2),
                  substring(@Letters,@i,1)
          set @i = @i + 1
      end
      GO
          CREATE FUNCTION [dbo].[fn_Decode](@Name nvarchar(500)) returns nvarchar(500) as BEGIN 
      
      --select top 10 * from tmpAuthors
      --declare @Name nvarchar(500) set @Name = 'АБВГДЕЁЖЗРЙКЛМНОП'
      
          declare @i int, @NameCode nchar(2), @TableCode nchar(2), @Letter nchar(1)
      
          set @i = 1 while @i < len(@Name) begin
      
              set @NameCode = substring(@Name,@i,2)
      
              if exists(select 1 from bDecode where Code = @NameCode 
                  and unicode(right(Code,1)) = unicode(right(@NameCode,1))) begin
      --print @Name
                  select @TableCode = Code, @Letter = Letter 
                  from bDecode where Code = @NameCode
                      and unicode(right(Code,1)) = unicode(right(@NameCode,1))
      
                  set @Name = left(@Name, @i - 1) + @Letter + right(@Name, len(@Name) - @i - 1)
              end
      
          set @i = @i + 1 end
      
      --print @Name
      
      --------------------------------------------
      
          RETURN @Name
      END
      GO
      
    2. 现在我执行解码:

      update tempTable set Name = dbo.fn_Decode(Name)
      
    3. 这适合我。