2012-12-19 21 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