2013-02-28 31 views
6

ノルウェーには、3つの非常に迷惑な文字があり、すべての種類の問題が発生します。 SQL Server 2008以降、マイクロソフトはコードページ65001をサポートしないことに決めました。私は、OPENROWSET(BULK)を使用してSQL ServerにUTF-8ファイルをインポートし、æøåトークンを保持するという問題に対する管理可能なソリューションを発見しました。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文字列)でなければなりません。

  • http://msdn.microsoft.com/en-us/library/ms178129.aspx
    • 代替は、バイナリデータとして読み込み、所望のコードページなどに、次いで(UTF-16である) NVARCHARVARBINARYからそれを変換する CONVERT関数を使用することです VARCHAR

    関連する問題