【发布时间】: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