2013-02-28 17 views
6

Norveç'te, her türlü soruna neden olan 3 son derece sinir bozucu karaktere sahibiz æøå. Sql server 2008'den bu yana, Microsoft, 65001 kod sayfasını desteklememeye karar verdi. OPENROWSET (BULK) ile bir UTF-8 dosyasını sql sunucusuna aktarma problemine yönetilebilir bir çözüm buldum ve æøå tokenlerini koru.Dosya içe aktarımı, UTF-8 kodlamasıyla kod sayfası = 65001, SQL sunucusuna aktarılır.

Dosyayı UTF-8'den varsayılan kodlamaya, ANSI'ye dönüştürmek için StreamReader ve StreamWriter kullanan bir powershell komut dosyası oluşturdum.

$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) 

İlk satırın, başlık satırının dosyasını aynı işlemde şeritlerim.

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

Sonra sql sunucu ve bunu yaparken verileri manipüle içine ANSI dosyasını almak için OPENROWSET kullanmak mümkün. Danish_norwegian harmanlamasına eşit olan 1252 kod sayfasını kullanma.

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 

Bu yöntem, Norveç tokenlerinin doğru şekilde görüntülendiğini doğruladı. biçim dosyası şuna benzer: Bu sorunu çözmek için bir yol bulmuş önce googleing zaman epey vakit geçirdim çünkü

<?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> 

Umut bu, başkasına yararlıdır.

cevap

0

Bunun yerine UTF16'ya dönüştürün. Bu, SQL Server'ın yerel NCHAR biçimidir ve Unicode değerlerinin tam temsilini sağlar.

size biçim dosyası SQLNCHAR veya SQLNVARCHAR belirtin ve ayrıca uyarı farkında olmak zorunda kalacak Bu işi yapmak için:

bir biçim dosyası Unicode karakter veri dosyası ile çalışması için, tüm giriş alanları Unicode metin dizeleri olmalıdır (yani, sabit boyutlu veya karakter sonlandırmalı Unicode dizeleri).

  • http://msdn.microsoft.com/en-us/library/ms178129.aspx
    • alternatif bir ikili veri olarak yüklemek ve arzu edilen kod sayfası olarak daha sonra (UTF-16 olan) NVARCHAR için VARBINARY den dönüştürmek için CONVERT işlevini kullanın ve etmektir VARCHAR.

    İlgili konular