我正在尝试使用SQL Server bcp实用程序从samba共享导入文本文件。 bcp在Unix行结尾时窒息。我确信我可以在Unix或Windows上添加一个中间步骤,将行结尾更改为Windows风格。但是我更愿意在没有修改的情况下从Unix导入文件。
有人知道是否有办法告诉SQL Server bcp查找Unix行结尾?
答案 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 ","
使用这种语法将进程输出流呈现为文件是一种bashism,因此不适用于其他一些shell,例如dash。它将与 zsh 一起使用
我使用 Windows 集成身份验证进行 AD,在 Linux 上是的,它可以使用 kerberos 执行此操作。这就是 -E
的 sqlcmd
标志和 -T
的 bcp
标志的原因。
答案 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。