在批量插入查询中使用不可打印的字符(除 \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 为前缀(虽然我不记得它在什么情况下会做什么),并且你的终止符将不会被识别。
我不敢相信这在某处没有答案,但我已经搜索了 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 为前缀(虽然我不记得它在什么情况下会做什么),并且你的终止符将不会被识别。