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

当我使用批量分隔文件(从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中,默认情况下它将使用Code-page 65001(65001:Unicode(UTF-8),俄文文本在Excel工作表中正常显示

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

networking上的一个build议是在批量插入中使用代码页65001。

因此代码:

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

但是这会产生错误:

消息2775,级别16,州13,3号线
代码页65001不被服务器支持。

我怎样才能获得服务器支持代码页65001?

另一个build议是使用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

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

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

    使用(DATAFILETYPE ='char',FIELDTERMINATOR ='\ t',FIRSTROW = 2,CODEPAGE = 1251)从'C:\ Users … \ MyFile.txt'中截断表tempTable批量插入tempTable

结果,我得到了这样的字段:

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

     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 СЉС 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) 

这对我有用。