我想使用BCP加载到带有nvarchar字段的SQL Server 2005表中,使用加载程序控制文件。据我了解,SQL Server 2005只支持UTF-16(我相信它是UTF-16 LE)。该文件由Java程序输出。我目前设置的方式如下:
XML格式BCP加载程序文件(使用以下命令创建:
bcp test_table format nul -c -x -T -f test_table.xml -S server
)
使用以下代码编写输出的Java程序:
File f = new File("from_java.txt");
String encoding = "x-UTF-16LE-BOM";
OutputStream os = new FileOutputStream(f);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(os, encoding);
String theString = "áááááLittle Endian, BOM\r\n";
outputStreamWriter.append(theString);
outputStreamWriter.flush();
outputStreamWriter.close();
然后使用以下bcp命令:
bcp test_table in from_java.txt -T -f test_table.xml -S server -error error.txt
我在表中得到的是ÿþá
。而不是áááááLittle Endian, BOM
我尝试了一些不同的更改参数排列:
-c 1252
选项,我可以使用它(但我不想这样做,因为我会正在失去信息,因为与1252相比,UTF-16是可以代表什么的超集。是否有人设法使用UTF-16数据和加载器格式配置文件将bcp加载到nvarchar字段中?
提前致谢,
-James
答案 0 :(得分:0)
我对答案一直不知所措,但我已经破解了它。
需要使用-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(错误地)调用它)是双字节字符编码。
关于以这种方式处理BCP的任何其他人的理智的一些注意事项:
以UTF-16写出可以这种方式加载的文件的Java代码如下:
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();