批量插入,SQL Server 2000,unix换行符

Joh*_*ley 34 sql sql-server bulkinsert

我试图将.csv文件插入到具有unix换行符的数据库中.我正在运行的命令是:

BULK INSERT table_name
FROM 'C:\file.csv' 
WITH 
( 
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
Run Code Online (Sandbox Code Playgroud)

如果我将文件转换为Windows格式,则加载有效,但如果可以避免,我不想执行此额外步骤.有任何想法吗?

小智 98

我觉得有必要做出贡献,因为我遇到了同样的问题,我需要每天至少阅读几次来自SAP的2个UNIX文件.因此,我不需要使用unix2dos,而是需要更少的人工干预和更多自动编程.

如上所述,Char(10)在sql字符串中工作.我不想使用sql字符串,所以我使用''''+ Char(10)+'''',但由于某种原因,这不能编译.

工作非常光滑的是:(ROWTERMINATOR ='0x0a')

用Hex解决了问题!

希望这有助于某人.


Joh*_*ley 14

感谢所有回答的人,但我找到了我的首选解决方案.

当您告诉SQL Server ROWTERMINATOR ='\n'时,它将此解释为Windows下的默认行终止符,实际上是"\ r \n"(使用C/C++表示法).如果您的行终止符实际上只是"\n",则必须使用下面显示的动态SQL.

DECLARE @bulk_cmd varchar(1000)
SET @bulk_cmd = 'BULK INSERT table_name
FROM ''C:\file.csv''
WITH (FIELDTERMINATOR = '','', ROWTERMINATOR = '''+CHAR(10)+''')'
EXEC (@bulk_cmd)
Run Code Online (Sandbox Code Playgroud)

为什么你不能说BULK INSERT ...(ROWTERMINATOR = CHAR(10))超出我的范围.看起来您不能评估命令的WITH部分中的任何表达式.

上面做的是创建一个命令字符串并执行它.巧妙地回避了创建附加文件或执行额外步骤的需要.


小智 5

我确认语法

ROWTERMINATOR = '''+CHAR(10)+'''
Run Code Online (Sandbox Code Playgroud)

与 EXEC 命令一起使用时有效。

如果您有多个 ROWTERMINATOR 字符(例如管道和 unix 换行符),则语法为:

ROWTERMINATOR = '''+CHAR(124)+''+CHAR(10)+'''
Run Code Online (Sandbox Code Playgroud)