在 SQL Server BCP xml 格式文件中使用不可打印的字符作为 TERMINATOR

Wou*_*ter 3 xml sql-server bcp encoding

我有一个纯文本数据文件,其中包含由不可打印字符"File Separator" (0x1c) 分隔的字段的记录。我正在尝试使用 SQL Server 的 bcp 实用程序将此数据加载到我的数据库中。然而,当使用文件分隔符的十六进制编码值作为 TERMINATOR 时,出现语法错误。

我试过使用

  • 十六进制编码值: "0x1c"
  • XML 编码值作为十六进制: ""
  • XML 编码值作为十进制: ""

这些都不起作用,但是当对可打印字符使用相同的编码时,例如tab,这确实有效:	, 	(0x9没有。不足为奇,因为这是一个 XML 文件。)

结论似乎是不支持不可打印的字符。是这种情况吗?这将是具有讽刺意味的,因为不可打印的分隔符正是为此目的而创建的......

您可以在下面找到重现此问题的所有代码:

XML 格式文件:test.xml

<?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="&#x1c;" MAX_LENGTH="10" COLLATION="Latin1_General_CS_AS_WS"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="41"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="COL1" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="2" NAME="COL2" xsi:type="SQLNUMERIC" PRECISION="4" SCALE="0"/>
 </ROW>
</BCPFORMAT>
Run Code Online (Sandbox Code Playgroud)

数据文件:test.txt
这只是一行,作为一个测试用例。StackExchange 不会在下面的行中显示分隔符,但是当您单击此帖子的“编辑”时,分隔符已包含在内,您应该能够复制粘贴它。

1111111112008
Run Code Online (Sandbox Code Playgroud)

命令行

bcp TEST_DB.dbo.UL_TEST in "test.txt" -T -f "test.xml"
Run Code Online (Sandbox Code Playgroud)

Sco*_*red 5

似乎从有关文档的BCP -指定字段和行终止符(SQL Server)的,非打印字符,不支持:

支持作为终结符的字符

bcp 命令、BULK INSERT 语句和 OPENROWSET 批量行集提供程序支持各种字符作为字段或行终止符,并且始终查找每个终止符的第一个实例。下表列出了支持的终止符字符。

在此处输入图片说明

作为一种选择,您可以使用POWERSHELL读取源文件并搜索\用0x1C其他字符(如 tilda (~))替换这些字符,然后输出到不同的文件。然后使用该字符作为终止符。

(Get-Content c:\test\test.txt) | ForEach-Object {$_ -replace [char]0x1C,'~'} | Set-Content c:\test\testout.txt
Run Code Online (Sandbox Code Playgroud)