当我在制表符分隔文件(从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
版本信息。如下:
答案 0 :(得分:-1)
当我遇到同样的问题时,我创建了自己的解决方法。我导入的UTF-8文本文件是由另一个应用程序创建/更新的,因此我无法更改文件格式。
Cyrillic_General_CI_AS
。nchar()
或nvarchar()
。我BULK INSERT
我的制表符分隔文本文件到临时表:
截断表tempTable 批量插入tempTable来自' C:\ Users ... \ MyFile.txt' with(DATAFILETYPE =' char',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)
这适合我。