6

ノルウェーには、あらゆる種類の問題を引き起こす 3 つの非常に迷惑なキャラクター æøå がいます。SQL Server 2008 以降、Microsoft はコードページ 65001 をサポートしないことを決定しました。OPENROWSET(BULK) を使用して UTF-8 ファイルを 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 サーバーにインポートし、その間にデータを操作することができます。コードページ 1252 を使用します。これは、danish_norwegian 照合に相当します。

    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>

この問題を解決する方法を見つける前に、かなりの時間をグーグルで検索したため、これが他の人の役に立てば幸いです。

4

1 に答える 1

0

代わりに UTF16 に変換してください。これは SQL Server のネイティブ NCHAR 形式であり、Unicode 値を完全に表現できます。

これを機能させるには、フォーマット ファイルで SQLNCHAR または SQLNVARCHAR を指定する必要があります。また、次の警告にも注意してください。

フォーマット ファイルが Unicode 文字データ ファイルを処理するには、すべての入力フィールドが Unicode テキスト文字列 (つまり、固定サイズまたは文字で終わる Unicode 文字列) である必要があります。

別の方法として、バイナリ データとしてロードし、CONVERT関数を使用して から (UTF-16) に変換してからVARBINARYNVARCHAR目的のコードページ asに変換することもできVARCHARます。

于 2013-02-28T15:09:42.400 に答える