我正在尝试使用 SQL Server bcp 实用程序从 samba 共享中导入文本文件。bcp 在 Unix 行尾令人窒息。我确信我可以在 Unix 或 Windows 上添加一个中间步骤,以将行尾更改为 Windows 样式。但我更愿意从 Unix 导入文件而不进行修改。
有人知道是否有办法告诉 SQL Server bcp 查找 Unix 行尾吗?
我正在尝试使用 SQL Server bcp 实用程序从 samba 共享中导入文本文件。bcp 在 Unix 行尾令人窒息。我确信我可以在 Unix 或 Windows 上添加一个中间步骤,以将行尾更改为 Windows 样式。但我更愿意从 Unix 导入文件而不进行修改。
有人知道是否有办法告诉 SQL Server bcp 查找 Unix 行尾吗?
简单的答案是使用十六进制,正如其中一条评论中提到的那样,作为行终止符:
-r 0x0a
您是否尝试设置 ROWTERMINATOR = '\n'?
我认为您不能从 bcp 命令行执行此操作。但是,我认为下面的 SQL 版本会起作用。
DECLARE @Command nvarchar(1000)
SET @Command = N'BULK INSERT MyTable
FROM ''<path\file>''
WITH (ROWTERMINATOR = '''+CHAR(10)+''')'
exec sp_executeSQL @Command
您必须使用带有 bcp 的格式文件并将终止符指定为 \n。交互式命令行将始终附加 \r,其中格式文件将完全使用您指定的内容。参考http://www.eggheadcafe.com/software/aspnet/32239836/bcp-out-with-char10-as-row-terminator.aspx。
BOL 中很好地解释了创建格式文件,但如果您需要帮助,请评论/更新您的原始帖子。
还有一种方便的方法可以解决这个问题。如果您想上传简单的 CSV,我的解决方案很好,对于更复杂的情况,请编写格式文件。
对换行符 ( ) 使用十六进制代码-r 0x0a
也很方便,但它不适用于 Ubuntu 18.04 上的 BCP 版本 17.6.0001.1。
所以我改用了一个小技巧:
将 unix 行尾替换为sed
,并将其输出流显示为文件。代码的相关部分:
<(< 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 一起使用
我对 AD 使用 Windows 集成身份验证,是的,在 Linux 上可以使用 kerberos 执行此操作。这就是为什么-E
标志sqlcmd
和-T
标志bcp
。
如果您没有太多时间详细研究 bcp,请查看以下内容:http: //msdn.microsoft.com/en-us/library/ms190759.aspx
它将为您提供简单的示例,解释交互式提示的含义,完成后保存格式的选项(如果您要重复执行此操作)等等。
如果您的数据很大和/或您有几个想要的字段,您可以先制作一个表格,然后进行一些尝试导出(bcp 将简单的选择作为第一个参数)并仍然以交互方式逐列选择格式。如果您有一些额外的原因,您可以稍后深入研究保存的 fmt 文件。
是的,这很让人抓狂。我的理解是 SQL Server bcp 总是在您希望使用的任何行终止符之前插入一个 \r 。所以,如果你不使用 -r,你会期望它只使用 \n。但它不会...它愚蠢地插入 \r 以便它可以使用 \r\n。如果你指定 -r \r\n 那么它仍然不起作用;我怀疑是因为它现在想要 \r\r\n 行结束。这是 Windows 世界的一些白痴编码的所有工作,他们试图让初学者的生活更轻松,最终让其他人几乎不可能做到。我在将文件从 Sybase 传输到 SQL Server 时遇到了这个问题,解决方案是在从 Sybase 输出的 bcp 中指定 -r \r\n (完全按照你的要求工作!)和 -r \n (或者只是不要'不要使用 -r) 用于 SQL Server bcp in。