【问题标题】:Using a non-printable char (other then \0 \n \t) as fieldterminator argument in a bulk insert query在批量插入查询中使用不可打印字符(除 \0 \n \t 外)作为字段终止符参数
【发布时间】:2018-02-13 09:27:21
【问题描述】:

我不敢相信这在某处没有得到解答,但我已经搜索了 MSDN、Stack Exchange 和 Google。我开始怀疑我想这样做是不可能的。

是否有人知道使用 SQL-server 在查询中执行此操作的方法(不使用其他工具,我已经看到使用 SSIS 的答案)?

假设我有一个 CSV 文件,其中包含由 SOH (StartOfHeader, char(1)) 和 \n als 行终止符终止的字段。我想我可以使用 BULK INSERT 导入它,例如:

BULK INSERT Fubar
[dbo].[Persovorlage_DE]FROM 'c:\temp\foo.bar'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = char(1),
    ROWTERMINATOR = '\n',
    TABLOCK,
    CODEPAGE = '1252'
)

可以,但不接受 char(1)。

有没有办法将 FIELDTERMINATOR 设置为 char(1)?

后记 1:

JeroenMostert 在 cmets 中建议使用 select char(1),并将其复制粘贴在 FIELDTERMINATOR 的单引号之间,这是不可见但有效的。

后记 2:

HoneyBadger 建议使用 0x01,这似乎也有效:

BULK INSERT Fubar FROM 'c:\temp\Foo.bar'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = '0x01',
    ROWTERMINATOR = '\n',
    TABLOCK,
    CODEPAGE = '1252'
)

把它放在一个答案中,我会接受它

【问题讨论】:

  • 我希望0x01 能够工作。
  • 复制并粘贴SELECT CHAR(1) 的输出。结果字符是不可见的,但放在引号之间它应该仍然有效。 (如果它确实有效,请不要忘记添加评论,因为这是等待发生的维护难题,当然。)
  • @Meine,是的。我经常有一个\n 的row_terminator,它会自动以\r 为前缀。在这种情况下,我成功地使用了0x0a。它也比空白更清晰。
  • 如果0x01 不起作用并且您不喜欢不可见的字符串,您的另一个选择是动态创建BULK INSERT 语句,您可以在其中显式添加CHAR(1) 到字符串然后EXEC 整件事。
  • 有趣的是,docs 没有提到对控制字符的这种支持,并且确实竭尽全力否认它们完全可用。没有提到 0x 语法。幸运的是,它们现在是可编辑的,而且它们确实接受拉取请求......但我没有足够的信心去做。

标签: sql-server insert delimiter bulk non-printing-characters


【解决方案1】:

虽然文档没有提及(甚至主动否认),但您可以使用十六进制值来指定特定字符。如:

BULK INSERT Fubar FROM 'c:\temp\Foo.bar'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = '0x01',
    ROWTERMINATOR = '\n',
    TABLOCK,
    CODEPAGE = '1252'
)

同样,如果你有一个 \n 终止符,你可以使用0x0a。如果你不这样做,\n 将自动以 \r 为前缀(虽然我记不起它在什么情况下会这样做),并且你的终止符将不会被识别。

【讨论】:

  • 引用 docs 说:“当您以交互方式使用 bcp 并指定 \n(换行符)作为行终止符时,bcp 会自动为其添加前缀 \r(回车)字符,结果在 \r\n 的行终止符中。”所以这至少是一个例子。
  • 啊,是的,这敲响了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多