2013-02-28 11 views
6

में फ़ाइल के आयात को कैसे संभाला जाए, नॉर्वे में हमारे पास 3 अत्यधिक परेशान करने वाले पात्र हैं, इसलिए, सभी प्रकार की समस्याएं पैदा होती हैं। एसक्यूएल सर्वर 2008 के बाद से, माइक्रोसॉफ्ट ने कोडपेज 65001 का समर्थन नहीं करने का फैसला किया। मुझे यूटीएफ -8 फ़ाइल को OPLROWSET (बल्क) के साथ एसक्यूएल सर्वर में आयात करने और æøå टोकन रखने की समस्या का एक प्रबंधनीय समाधान मिला है।यूटीएफ -8 एन्कोडिंग, कोडपृष्ठ = 65001, एसक्यूएल सर्वर

मैंने एक पावरहेल स्क्रिप्ट बनाई है जो फ़ाइल को यूटीएफ -8 से डिफ़ॉल्ट एन्कोडिंग, एएनएसआई में कनवर्ट करने के लिए StreamReader और StreamWriter का उपयोग करता है।

$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 उपयोग करने में सक्षम हूँ। कोडपेज 1252 का उपयोग करना, जो danish_norwegian collation के बराबर है।

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

इसके बजाय यूटीएफ 16 में कनवर्ट करें। वह SQL सर्वर का मूल NCHAR प्रारूप है, और यूनिकोड मानों का पूर्ण प्रतिनिधित्व करने की अनुमति देता है।

यह काम आप अपने प्रारूप फ़ाइल में SQLNCHAR या SQLNVARCHAR निर्दिष्ट करें, और भी चेतावनी के बारे में पता होना होगा करने के लिए:

एक प्रारूप फ़ाइल यूनिकोड वर्ण डेटा फ़ाइल के साथ काम करने के लिए, सभी इनपुट फ़ील्ड यूनिकोड टेक्स्ट स्ट्रिंग्स (यानी, निश्चित आकार या वर्ण-समाप्त यूनिकोड तार) होना चाहिए।

एक वैकल्पिक बाइनरी डेटा के रूप में यह लोड और के रूप में वांछित कोडपेज को CONVERT फ़ंक्शन का उपयोग करें यह VARBINARY से NVARCHAR कन्वर्ट करने के लिए (जो UTF-16 है) और फिर करने के लिए है VARCHAR

संबंधित मुद्दे