sql-server - 在批量插入查询中使用不可打印的字符(\0\n\t 除外)作为字段终止符参数

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

我不敢相信这个问题没有在某个地方得到解答,但我已经搜索了 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 为前缀(尽管我记不清在什么情况下会这样做),并且您的终止符将不会被识别。

关于sql-server - 在批量插入查询中使用不可打印的字符(\0\n\t 除外)作为字段终止符参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48763390/

相关文章:

sql-server - 如何在 R 中使用 RODBC 从 Sql Server 读取 utc 时间戳?

c++ - C++ 中的 unordered_map 插入是如何工作的?

mysql - 使用循环将多个相同形式的数组插入到一个表中

MySQL 插入但更新/忽略重复

java - 在 Java 中将 csv 转换为 xls 时出现问题?只需要核心 Java 经验 - 问题与导入无关

sql - 比较sql中两列的总和

sql-server - SQL Server 更新行,如 '%#186;%'

php - 如何从字符串中的特定字段中删除引号?

java - 正则表达式 - 文字字符串和引号之间的匹配

java - 如何在 Java 中为分隔符指定多种模式