在挪威,我们有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
此方法确保挪威令牌正确显示。格式文件看起来是这样的:
希望这是有帮助别人,因为我花了很多时间googleing之前,我找到了一种方法来解决这个问题。