Я использую SQL Server 2014 Enterprise и Visual Studio 2103.
У меня есть сотни файлов TSV, которые содержат иностранные символы, которые я импортирую в SQL Server.У меня есть пакет служб SSIS, который автоматизирует это (просто задача сценария, которую я нашел в Интернете с использованием C #).Таблицы создаются с типом данных NVARCHAR(MAX)
для всех столбцов, затем сценарий считывает построчно каждый файл со значениями, вставляемыми в таблицы.
Исходные файлы TSV экспортируются как Unicode, но SQL Serverпохоже, это не волнует - он импортирует файлы как VARCHAR
(т. е. китайские иероглифы отображаются как «?????»).Если вы вручную импортируете файл в SQL Server, на кодовой странице отображается «65001 (UTF-8)», поэтому я не уверен, почему для типов данных по умолчанию установлено значение VARCHAR
.
. Теперь, я полагаю, я могу настроитьпреобразование данных для каждого из файлов, но их слишком много, и я думаю, что это можно сделать на лету с помощью вставки задачи сценария:
ЗАДАНИЕ СКРИПТА:
Некоторыепеременные для кодирования:
Encoding ascii = Encoding.ASCII;
Encoding unicode = Encoding.Unicode;
Encoding utf8 = Encoding.UTF8;
Encoding utf32 = Encoding.UTF32;
В следующей части кода задачи сценария я пытаюсь преобразовать кодировку (первая часть оператора IF (не показана) создает таблицу получения).Он выдает ошибки там, где указано:
else
{
//ADJUST FOR SINGLE QUOTES:
line = line.Replace("'", "''");
byte[] unicodeBYTES = unicode.GetBytes(line);
byte[] unicodeCONVERT = Encoding.Convert(unicode, utf8, unicodeBYTES); <--- ERRORS OUT
char[] unicodeCHARS = new char[unicode.GetCharCount(unicodeCONVERT, 0, unicodeCONVERT.Length)];
unicode.GetChars(unicodeCONVERT, 0, unicodeCONVERT.Length, unicodeCHARS, 0);
string NEWline = new string(unicodeCHARS);
string query = "Insert into " + SchemaName + ".[" + TableName + "] (" + ColumnList + ") ";
query += "VALUES('" + NEWline + "')";
// MessageBox.Show(query.ToString());
SqlCommand myCommand1 = new SqlCommand(query, myADONETConnection);
myCommand1.ExecuteNonQuery();
}
Однако, если я изменю строку:
byte[] unicodeCONVERT = Encoding.Convert(unicode, utf8, unicodeBYTES);
на следующее:
byte[] unicodeCONVERT = Encoding.Convert(unicode, unicode, unicodeBYTES);
Загружает данные,но все еще в формате ASCII (с символами «?????»).
Любая помощь будет оценена.
Спасибо.