SQL Server可以在一个带有Unix行结尾的文件中使用bcp吗?

时间:2009-09-29 18:52:09

标签: sql-server database cross-platform bcp line-endings

我正在尝试使用SQL Server bcp实用程序从samba共享导入文本文件。 bcp在Unix行结尾时窒息。我确信我可以在Unix或Windows上添加一个中间步骤,将行结尾更改为Windows风格。但是我更愿意在没有修改的情况下从Unix导入文件。

有人知道是否有办法告诉SQL Server bcp查找Unix行结尾?

7 个答案:

答案 0 :(得分:5)

简单的答案是使用其中一个注释中提到的十六进制作为行终止符:

-r 0x0a

答案 1 :(得分:2)

你试过设置ROWTERMINATOR ='\ n'?

答案 2 :(得分:2)

我认为你不能从bcp命令行执行此操作。但是,我认为以下SQL版本将起作用。

DECLARE @Command nvarchar(1000)

SET @Command = N'BULK INSERT MyTable
FROM ''<path\file>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')'

exec sp_executeSQL @Command

答案 3 :(得分:2)

您必须使用带有bcp的格式文件,并将终结符指定为\ n。交互式命令行将始终附加\ r \ n,其中格式文件将使用您指定的内容。参考http://www.eggheadcafe.com/software/aspnet/32239836/bcp-out-with-char10-as-row-terminator.aspx

在BOL中可以很好地解释创建格式文件,但如果您需要帮助,请评论/更新您的原始帖子。

答案 4 :(得分:1)

通过将进程输出呈现为文件的替代解决方案

还有另一种方便的方法可以解决这个问题。如果您想上传一个简单的 CSV,对于更复杂的情况 write a format file,我的解决方案是很好的。

对换行符 (-r 0x0a) 使用十六进制代码也很方便,但它不适用于 Ubuntu 18.04 上的 BCP 版本 17.6.0001.1。

所以我用了一个小技巧:

sed 替换 unix 行尾,并将其输出流显示为文件。代码的相关部分:

<(< iris.csv sed 's/\r*$/\r/')

如下所示,sed 的输出显示为文件:

ls <(< iris.csv sed 's/\r*$/\r/')

输出:

/proc/self/fd/11

一个完整的例子

我在工作目录中有 iris.csv

>  head -n 5 iris.csv
sepal_length,sepal_width,petal_length,petal_width,species
5.1,3.5,1.4,0.2,setosa
4.9,3.0,1.4,0.2,setosa
4.7,3.2,1.3,0.2,setosa
4.6,3.1,1.5,0.2,setosa

我可以像这样使用 bcp 加载到 MS SQL 中:

query=$(cat << EOF
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='iris' and xtype='U')
    CREATE TABLE iris (
        sepal_length FLOAT NOT NULL,
        sepal_width  FLOAT NOT NULL,
        petal_length FLOAT NOT NULL,
        petal_width  FLOAT NOT NULL
    )
GO
EOF
)

sqlcmd \
    -S localhost,31433 \
    -E \
    -d "testdb" \
    -Q "$query"

bcp \
    iris in <(< iris.csv sed 's/\r*$/\r/') \
    -S localhost,31433 \
    -T \
    -d "testdb" \
    -n \
    -t ","

注意事项

  1. 使用这种语法将进程输出流呈现为文件是一种bashism,因此不适用于其他一些shell,例如dash。它将与 zsh 一起使用

  2. 我使用 Windows 集成身份验证进行 AD,在 Linux 上是的,它可以使用 kerberos 执行此操作。这就是 -Esqlcmd 标志和 -Tbcp 标志的原因。

答案 5 :(得分:0)

如果您没有足够的时间详细研究bcp,请查看以下内容: http://msdn.microsoft.com/en-us/library/ms190759.aspx

它将为您提供简单的示例,解释交互式提示的含义,完成后保存格式的选项(如果您要反复执行此操作)等等。

如果你的数据很大和/或你有几个你想要的filds,你可以先创建一个表然后进行一些试验导出(bcp将采用一个简单的选择作为第一个arg)并仍然以交互方式选择格式,列按列。如果你有一些额外的原因,你可以挖掘保存的fmt文件。

答案 6 :(得分:-2)

是的,这令人抓狂。我的理解是SQL Server bcp总是在你期望使用的任何行终止符之前插入\ r \ n。所以,如果你不使用-r,你会希望它只使用\ n。但它没有...它愚蠢地插入\ r,以便它可以使用\ r \ n。如果指定-r \ r \ n那么它仍然不起作用;我怀疑是因为它现在想要\ r \ n \ n \ n \ n行结束。这是Windows世界的一些白痴编码的所有工作,试图让初学者的生活变得更轻松,并最终让其他人无法实现。我在将文件从Sybase传输到SQL服务器时遇到了这个问题,解决方法是在Sybase的bcp中指定-r \ r \ n(完全按照你的要求运行!)和-r \ n(或者只是不要不要使用-r)用于SQL Server bcp in。