Я был буквально не в восторге от ответов, но я взломал его.
Файл загрузчика должен быть создан с флагом -w
, поэтому команда для создания файла:
bcp <table> format nul -w -x T -f loader-control-w-format.xml -S <server> -t "||"
Это приводит к тому, что файл управления загрузчиком выглядит немного иначе, вы получаете записи, такие как:
<FIELD ID="1" xsi:type="NCharTerm" TERMINATOR="|\0|\0" MAX_LENGTH="1000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
Обратите внимание, что разделитель указан как |\0|\0
, нули соответствуют дополнительному байту в файле, так как UTF-16 (или просто "unicode", как Microsoft (ошибочно) называет это) является двухбайтовой кодировкой символов.
Некоторые примечания для здравомыслия любого, кто имеет дело с ППГ таким образом:
- Когда SQLServer говорит о «нативных», они означают нативные символы, то есть символы с акцентом
- Когда SQLServer говорит об Unicode, они на самом деле имеют в виду UTF16 (Little Endian) способ кодирования Unicode набор символов . Это то, что -w относится к
- При записи файла для загрузки в BCP с использованием UTF-16 файл должен быть в формате UTF-16 Little Endian и не может содержать спецификацию UTF (поскольку BCP будет интерпретировать этот байт, который должен быть загружен, и ваш первый запись будет содержать спецификацию, ура!)
Java-код для записи файла в UTF-16, который можно загрузить таким образом, выглядит следующим образом:
final File f = new File("C:\\temp\\bcp_prob\\from_java-UTF-16.txt");
//LE with no BOM is important here:
final String encoding = "UTF-16LE";
final OutputStream os = new FileOutputStream(f);
final OutputStreamWriter outputStreamWriter = new OutputStreamWriter(os, encoding);
final String theString = "UTF-16-LE, intermetálico básicos intermetálico película magnética dinámicos||another_col\r\n";
outputStreamWriter.append(theString);
outputStreamWriter.flush();
outputStreamWriter.close();