本文介紹了如何處理將UTF8編碼的文件(代碼頁=65001)導入到SQL SERVER中的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
在挪威,我們有3個非常令人討厭的角色,??aka,他們制造了各種各樣的問題。自2008年以來,微軟決定不再支持代碼頁65001。對于使用OPENROWSET(BULK)將UTF-8文件導入到SQL SERVER中并保留??aka令牌的問題,我找到了一個可管理的解決方案。
我創建了一個PowerShell腳本,該腳本使用StreamReader和StreamWriter將文件從UTF-8轉換為默認編碼ANSI。
$filename = "C:TestUTF8_file.txt"
$outfile = "C:TestANSI_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,它等于丹麥_挪威排序規則。
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:TestANSI_file.txt',
FORMATFILE = 'C:TestFormatBulkInsert_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='
' />
</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>
希望這對其他人有幫助,因為我花了相當多的時間在Google上搜索才找到解決這個問題的方法。
推薦答案
改為轉換為UTF16。這是SQL Server的原生NCHAR格式,并允許完全表示Unicode值。
要執行此操作,您必須在格式化文件中指定SQLNCHAR或SQLNVARCHAR,并注意以下注意事項:
要使格式化文件使用Unicode字符數據文件,所有輸入字段都必須是Unicode文本字符串(即固定大小或以字符結尾的Unicode字符串)。
http://msdn.microsoft.com/en-us/library/ms178129.aspx
另一種方法是將其作為二進制數據加載,并使用CONVERT
函數將其從VARBINARY
轉換為NVARCHAR
(即UTF-16),然后轉換為所需的代碼頁,即VARCHAR
。
這篇關于如何處理將UTF8編碼的文件(代碼頁=65001)導入到SQL SERVER中的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,