批量插入俄语和其他国际字符到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/更新的,所以我无法更改文件格式。
- 我的数据库有整理
Cyrillic_General_CI_AS
。 - 所有将包含俄语的列都被声明为
nchar()
或nvarchar()
。 -
我
BULK INSERT
我的制表符分隔的文本文件到临时表中:使用(DATAFILETYPE ='char',FIELDTERMINATOR ='\ t',FIRSTROW = 2,CODEPAGE = 1251)从'C:\ Users … \ MyFile.txt'中截断表tempTable批量插入tempTable
结果,我得到了这样的字段:
РђР'Р'ГДЕЁЖЗРЙКЛМНОПРСТУФХЦЧШЩЪЫЬРЮЯР
-
为了解码,我创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
-
现在我执行解码:
update tempTable set Name = dbo.fn_Decode(Name)
这对我有用。