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.