5

我正在尝试使用 SQL Server bcp 实用程序从 samba 共享中导入文本文件。bcp 在 Unix 行尾令人窒息。我确信我可以在 Unix 或 Windows 上添加一个中间步骤,以将行尾更改为 Windows 样式。但我更愿意从 Unix 导入文件而不进行修改。

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

4

7 回答 7

8

简单的答案是使用十六进制,正如其中一条评论中提到的那样,作为行终止符:

-r 0x0a
于 2016-08-18T18:04:10.447 回答
2

您是否尝试设置 ROWTERMINATOR = '\n'?

于 2009-09-29T19:01:37.720 回答
2

我认为您不能从 bcp 命令行执行此操作。但是,我认为下面的 SQL 版本会起作用。

DECLARE @Command nvarchar(1000)

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

exec sp_executeSQL @Command
于 2010-07-28T22:26:48.293 回答
2

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

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

于 2010-07-29T13:49:14.187 回答
1

通过将流程输出显示为文件的替代解决方案

还有一种方便的方法可以解决这个问题。如果您想上传简单的 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 ","

注意

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

  2. 我对 AD 使用 Windows 集成身份验证,是的,在 Linux 上可以使用 kerberos 执行此操作。这就是为什么-E标志sqlcmd-T标志bcp

于 2021-03-12T16:29:51.787 回答
0

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

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

如果您的数据很大和/或您有几个想要的字段,您可以先制作一个表格,然后进行一些尝试导出(bcp 将简单的选择作为第一个参数)并仍然以交互方式逐列选择格式。如果您有一些额外的原因,您可以稍后深入研究保存的 fmt 文件。

于 2010-08-03T10:08:33.363 回答
-2

是的,这很让人抓狂。我的理解是 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。

于 2010-06-02T16:13:15.803 回答