अपडेट:यह समस्या स्पष्ट रूप से 2016-11-04 को जारी फ्रीटीडीएस v1.0.16 में तय की गई है।
मैं फ्रीटीडीएस v1.0.15 का उपयोग करके आपकी समस्या को पुन:पेश कर सकता हूं। यह निश्चित रूप से freebcp
में एक बग जैसा दिखता है यह तब विफल हो जाता है जब किसी टेक्स्ट फ़ील्ड के अंतिम वर्ण में U+20xx
प्रपत्र का यूनिकोड कोड बिंदु होता है . (कारण के बारे में मेरे निष्कर्ष को सही करने के लिए @srutzky को धन्यवाद।) जैसा कि आपने नोट किया, यह काम करता है ...
291054 Ţawī Rifā
... और यह विफल हो जाता है ...
291054 Ţawī Rifā‘
... लेकिन मैंने पाया कि यह भी काम करता है:
291054 Ţawī Rifā‘x
तो, आपकी इनपुट फ़ाइल के विरुद्ध एक स्क्रिप्ट चलाने के लिए एक बदसूरत कामकाज होगा जो प्रत्येक टेक्स्ट फ़ील्ड में कम-ऑर्डर गैर-स्पेस यूनिकोड वर्ण जोड़ देगा (उदाहरण के लिए, x
जो U+0078
. है , जैसा कि ऊपर के अंतिम उदाहरण में है), freebcp
. का उपयोग करें डेटा अपलोड करने के लिए, और फिर एक UPDATE
चलाएं अतिरिक्त वर्ण को हटाने के लिए आयातित पंक्तियों के विरुद्ध कथन।
व्यक्तिगत रूप से, मैं लिनक्स के लिए फ्रीटीडीएस से माइक्रोसॉफ्ट के एसक्यूएल सर्वर ओडीबीसी ड्राइवर पर स्विच करने के इच्छुक हूं, जिसमें bcp
शामिल है। और sqlcmd
उपयोगिताएँ जब यहाँ वर्णित निर्देशों का उपयोग करके स्थापित की जाती हैं:
https://gallery.technet.microsoft.com /scriptcenter/SQLCMD-and-BCP-for-Ubuntu-c88a28cc
मैंने अभी Xubuntu 16.04 के तहत इसका परीक्षण किया है, और हालांकि मुझे libssl.so.1.0.0
का उपयोग करने के लिए प्रक्रिया में थोड़ा बदलाव करना पड़ा। के बजाय libssl.so.0.9.8
(और libcrypto
. के लिए भी ऐसा ही है ), एक बार जब मैंने इसे स्थापित कर लिया तो bcp
जहां freebcp
. में Microsoft की उपयोगिता सफल हुई विफल।
यदि लिनक्स के लिए SQL सर्वर ODBC ड्राइवर मैक पर काम नहीं करेगा तो दूसरा विकल्प SQL सर्वर के लिए Microsoft JDBC ड्राइवर 6.0 और जावा कोड का एक छोटा सा उपयोग करना होगा, जैसे:
connectionUrl = "jdbc:sqlserver://servername:49242"
+ ";databaseName=myDb"
+ ";integratedSecurity=false";
String myUserid = "sa", myPassword = "whatever";
String dataFileSpec = "C:/Users/Gord/Desktop/bad.txt";
try (
Connection conn = DriverManager.getConnection(connectionUrl, myUserid, myPassword);
SQLServerBulkCSVFileRecord fileRecord = new SQLServerBulkCSVFileRecord(dataFileSpec, "UTF-8", "\t", false);
SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(conn)) {
fileRecord.addColumnMetadata(1, "col1", java.sql.Types.NVARCHAR, 50, 0);
fileRecord.addColumnMetadata(2, "col2", java.sql.Types.NVARCHAR, 50, 0);
bulkCopy.setDestinationTableName("dbo.freebcptest");
bulkCopy.writeToServer(fileRecord);
} catch (Exception e) {
e.printStackTrace(System.err);
}