【问题标题】:Can SQL Server bcp in a file with Unix line endings?SQL Server 可以在具有 Unix 行结尾的文件中 bcp 吗?
【发布时间】:2010-12-02 10:21:01
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    -r 0x0a
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • +1 答案。 BOL 链接也指向 msdn.microsoft.com/en-us/library/ms191485.aspx,它提到了交互式。
      • 我希望能回答你的问题... :-)
      • 我无法很快验证这一点,但这是有道理的。基于 gbn 的认可,我接受了这个答案。
      • @John M Gant:谢谢。我一直明白您需要一个格式文件来覆盖命令提示符设置,bcp 是一个命令行实用程序。因此,您当然不能在 Windows 命令提示符中使用 UNIX 行行尾...
      【解决方案3】:

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

      【讨论】:

      • 我可以使用 -r 参数并将其设置为 \n,但这是默认设置,所以我认为它不会有任何好处。此外,它可能会将 \n 解释为特定于平台的行终止符,这会给我们带来与以前相同的问题。你说的是-r参数吗?
      • msdn.microsoft.com/en-us/library/ms188365.aspx,这表示默认是 '\r\n' 这不一样。
      • 好的,我明白了。我使用的是 bcp 命令行实用程序,而不是批量插入。它有不同的选项和默认值。
      【解决方案4】:

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

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

      【讨论】:

      • 我用于此的 BCP 命令等效项是将行终止符指定为换行符,例如:-r 0xa
      【解决方案5】:

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

      还有其他方便的方法可以解决这个问题。如果您想上传简单的 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. 我为 AD 使用了 Windows 集成身份验证,是的,在 Linux 上可以使用 kerberos 进行此操作。这就是为什么-E 标志为sqlcmd-T 标志为bcp

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

          是的,这太疯狂了。我的理解是 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 (或者只是不't use -r) for the SQL Server bcp in.

          【讨论】:

          • 如果您阅读 bcp,您就会知道这是记录在案以及如何绕过它。我 maan,除了简单的 CSV 之外,什么样的白痴不会使用格式文件。或者使用 SSIS。
          • @gbn,那个白痴就是我!下次我会研究一下格式文件。
          猜你喜欢
          • 1970-01-01
          • 2019-01-20
          • 1970-01-01
          • 2012-05-21
          • 2014-09-30
          • 1970-01-01
          • 2020-04-19
          • 1970-01-01
          • 2017-06-03
          相关资源
          最近更新 更多