2015-06-17 30 views
1

當我使用批量插入選項卡分隔文件(從UNIX SAP系統導出)到SQL Server 2008 R2時,Short_text字段會變成象形文字(如果它們是俄語等擴展字符)。批量將俄語及其他國際字符插入到SQL Server 2008中

我的代碼是:

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工作表

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

之一出來OK在網絡上的建議是在批量插入使用代碼頁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
The code page 65001 is not supported by the server.

我如何獲得代碼頁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

當我遇到同樣的問題時,我創建了自己的解決方法。我導入的UTF-8文本文件是由另一個應用程序創建/更新的,因此我無法更改文件格式。

  1. 我的數據庫有校對Cyrillic_General_CI_AS
  2. 將包含俄語的所有列聲明爲nchar()nvarchar()
  3. BULK INSERT我的製表符分隔文本文件到臨時表:

    截斷表不是Temptable 大部分來自「C插入不是Temptable:\用戶\ MyFile的。TXT」 與(DATAFILETYPE = '字符',FIELDTERMINATOR = '\ t' 的 FIRSTROW = 2,CODEPAGE = 1251)

結果,我正在看起來像這樣的字段:

АБВР「Р」ЕЁЖЗРЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯР
  • 爲了解碼,我創建的表和一個函數:

    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 
    
  • 現在我每形式解碼:

    update tempTable set Name = dbo.fn_Decode(Name) 
    
  • 這對我的作品。

    +1

    非常不好格式化 –

    +0

    請把這個弄清楚,這樣你想說的就可以理解了。 – thesecretmaster

    +0

    我試圖格式化這個答案,編輯器將不允許在所有代碼放入代碼塊時保存它。 –