在批量插入查询中使用不可打印的字符(除 \0 \n \t 之外)作为 fieldterminator 参数

Using a non-printable char (other then \0 \n \t) as fieldterminator argument in a bulk insert query

我不敢相信这在某处没有答案,但我已经搜索了 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 在评论中建议使用 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'
)

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

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

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

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