2013-02-28 17 views
6

在挪威,我們有3個令人討厭的角色,造成各種各樣的問題。由於SQL Server 2008,微軟決定不支持代碼頁65001.我已經找到了一個可管理的解決方案,用UTF-8文件導入到帶有OPENROWSET(BULK)的sql server中,並保留了標記。如何處理UTF-8編碼(codepage = 65001)文件導入SQL服務器

我創建了一個使用StreamReader和StreamWriter將文件從UTF-8轉換爲默認編碼ANSI的powershell腳本。

$filename = "C:\Test\UTF8_file.txt" 
$outfile = "C:\Test\ANSI_file.txt" 
$reader = new-object System.IO.StreamReader($filename, [System.Text.Encoding]::GetEncoding(65001)) 
$stream = new-object System.IO.StreamWriter($outfile, $false, [System.Text.Encoding]::Default) 

我在同一個進程中去掉第一行,標題行的文件。

$i=1 
while(($line = $reader.ReadLine()) -ne $null) { 
    if($i -gt 1) { 
     $stream.WriteLine($line) 
    } 
    $i++ 
} 
$reader.Close() 
$stream.Close() 

然後,我可以使用OPENROWSET將ANSI文件導入到sql server中,並在這樣做時處理數據。使用等於danish_norwegian排序規則的代碼頁1252。

insert into SomeDatabase.dbo.SomeTable 
SELECT [companynumber] 
, case [role] when 'Styreformann' then 'Styreleder' when 'Styrets leder' then 'Styreleder' else rolle end as 'role' 
, case [representant] when 'Y' then '1' else '0' end as 'representant' 
, left((RIGHT('0000'+ CONVERT(VARCHAR,postnr),5)),4) end as 'postnr' 
, income*1000 as income 
, null as person2id 
FROM OPENROWSET(BULK 'C:\Test\ANSI_file.txt', 
FORMATFILE = 'C:\Test\FormatBulkInsert_file.xml' 
, CODEPAGE =1252 
, ROWS_PER_BATCH = 50000  
) as v 

此方法確保挪威令牌正確顯示。格式文件看起來是這樣的:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <RECORD> 
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR=';"' /> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='";"' /> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR='";"' /> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR='";' /> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR=';' /> 
    <FIELD ID="6" xsi:type="CharTerm" TERMINATOR='\n' /> 
    </RECORD> 
    <ROW> 
    <COLUMN SOURCE="1" NAME="companynumber" xsi:type="SQLINT"/> 
    <COLUMN SOURCE="2" NAME="role" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="3" NAME="representant" xsi:type="SQLBIT"/> 
    <COLUMN SOURCE="4" NAME="postnr" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="5" NAME="income" xsi:type="SQLDECIMAL"/> 
    <COLUMN SOURCE="6" NAME="person2id" xsi:type="SQLINT"/> 
    </ROW> 
</BCPFORMAT> 

希望這是有幫助別人,因爲我花了很多時間googleing之前,我找到了一種方法來解決這個問題。

回答

0

改爲轉換爲UTF16。這是SQL Server的本地NCHAR格式,並允許完整表示Unicode值。

爲了使這項工作,你必須指定SQLNCHAR或SQLNVARCHAR在格式文件,並且也意識到了警告的:

對於格式文件與Unicode字符數據文件時,所有的輸入字段必須是Unicode文本字符串(即固定大小或字符終止的Unicode字符串)。

另一種方法是將其加載作爲二進制數據,並使用CONVERT函數將其從VARBINARY轉換爲NVARCHAR(這是UTF-16),然後以期望的代碼頁作爲VARCHAR