2012-12-19 24 views
2

我导入源CSV文件,我不知道该信源编码,我只能看到两种�(ANSI编码)或(UTF8-没有-BOM编码),当我用Notepad++related question)打开文件。重音字符不能正确地与BULK INSERT进口

此文件已经导入到使用bulk insert数据库mssql-2008

DECLARE @bulkinsert NVARCHAR(2000)    
    SET @bulkinsert =    
N'BULK INSERT #TempData FROM ''' +    
@FilePath +    
N''' WITH (FIRSTROW = 2,FIELDTERMINATOR = ''","'',ROWTERMINATOR =''\n'')'    
    EXEC sp_executesql @bulkinsert 

这是然后在列1(varchar())复制到正规table1#tempData。现在当我看到这table1我看到一些?在这些字符的地方。

我试过castnvarchar()但它没有帮助。

当我深入了解那些字符真正支持我们同时下载的链接时,我看到的字符是é,ä,å等等。

我会使用replace修复数据,但我需要制作一些丑陋的代码,并查看单词的单个模式并进行替换,因此看起来很难。

数据库/表归类:SQL_Latin1_General_CP1_CI_AS COLUMN1(VARCHAR(80))

能否这些字符更改为类似英文字符或原始字符,而不是?马克。我看过Collation and Unicode Support哪个帮不了我。我明白了编码的含义,但没有提供给我what to do。我已经查看了stackoverflow的大部分帖子,是的,有一些关于它的帖子,但与我的搜索不符。

我无法弄清问题出在哪里。

+0

你提的问题是非常不清楚。你是说当你导入一个文本文件时,SQL Server中的数据不正确?如果是这样,您需要提供以下信息:文本文件的编码,目标列的数据类型,您在哪里看到不正确的字符。 – Pondlife

+0

@Pondlife感谢您的回复。我现在已经更新了这个问题,我希望它更清楚。 – tough

+0

我还是不明白,所有的细节,但我最好的猜测是,你要导入Unicode数据成'varchar'列,而不是一个'nvarchar'之一。我建议你确保在'#tempData'所有的字符列是'nvarchar',然后尝试添加'DATAFILETYPE =“widechar''到您的['BULK INSERT'命令(http://msdn.microsoft.com/en -us /库/ ms188365(v = SQL.100)的.aspx)。忘记'table1',直到'#tempData'中有干净的数据。 – Pondlife

回答

2

它在评论中回答。你试过了吗?

http://msdn.microsoft.com/en-us/library/ms189941.aspx

选项DATAFILETYPE = 'widenative'

基于从Esailiga评论之前做过或批量导入后的文本被截断。我同意这听起来像CSV文件本身是单字节。 Unicode需要选项DATAFILETYPE ='widenative'。如果CSV文件是单字节,则不是魔术翻译。

太糟糕了,是扩展ASCII并且支持SQL字符,因此更多证据表明问题出在CSV上。
SELECT CAST( 'E' 为char(1))
通知这个工程作为扩展ASCII(< 255)

听起来像是你需要去回源。

The?在SQL中是未知的。与记事本中的Same相同。

+1

不要紧,即使他正确地做一切,他将结束与''因为这是数据是什么。您无法以任何方式修复文字“ ”。在这种情况下,“ ”仅仅是表面错误的表示,而文字数据就是这种情况。 – Esailija

+1

@Esailija好的,我认为我同意。仍然认为OP应该用DATAFILETYPE ='widenative'进行测试,因为一旦数据得到修复,就需要这样做。希望你会得到另一个问题的检查。 – Paparazzi

+0

@Blam我将测试,看看它是否与“widenative”为'datafiletype'类型的希望工程,以及改变#tempData认定中,看看我是否能真正得到它的权利,否则我将不得不在Esailija的点完全同意。所有帮助的荣誉。我希望能再给一个。 – tough

0

我还是不能相信这么多年后微软还没有解决这个明显的问题。èéêë等应该没有问题,因为它们都是ascii(< 255)。这个任务提出了一遍又一遍在许多网站和问题还没有得到回答

我的数据是在Excel表格。在生成插入语句后,第二次解析表,查找asccii>'z'并生成并更新表集列语句以覆盖导入的数据。繁琐但可行

1

我已经做到了!经过这么多年,我们都看错了地方。没有工作需要重写脚本...

问题在于SSMS ...如果您通过右键单击“查询”来“新查询”,您可以重命名该文件,但不会创建为您完成的文件...

但是如果你把“CTRL + N”你得到一个新的查询窗口进行编辑,但没有文件被创建...所以你自己保存,并选择保存按钮编码......朝你会发现UTF-8(无签名)代码页65001

,就是这样的列表的底部...脚本之后

脚本打开一个新的查询窗口“CTRL + N”复制和粘贴从一个现有的查询并保存如上所述。而仿佛被施了魔法它的工作原理

如果你像我一样在Excel表格...解析表写输出到一个新的工作簿中的第1列1片,然后另存为,选择UTF-8编码

要加快处理速度与包含注释的模板文件“ - UTF-8”这样的事情。将其保存为UTF-8和使用*粘贴到Excel .SQL的文件列表来连接的 =串连的列表( “仁templatefile.txt”,CHAR(34)中,a1,CHAR(34))在b 1 和砸下来

经过这些年的手动解决方案,我从字面上与发现的兴奋出汗。谢谢你让我不高兴

3

在我的情况,我可以用的代码页选项固定的编码问题:

BULK 
INSERT #CSV 
FROM 'D:\XY\xy.csv' 
WITH 
(
    CODEPAGE = 'ACP', 
    DATAFILETYPE ='char', 
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n', 
    FIRSTROW = 2 
) 

可能的值: CODEPAGE = {“ACP” | 'OEM'| 'RAW'| “code_page”}]

您可以找到有关此选项的详细信息: BULK INSERT