【问题标题】:SQL Server Bulk Insert - 0 row(s) affectedSQL Server 批量插入 - 0 行受影响
【发布时间】:2017-01-19 11:57:20
【问题描述】:

我正在尝试从远程位置批量插入 .CSV

我的 SQL 语句是:

BULK INSERT dbo.tblMaster 
FROM '\\ZAJOHVAPFL20\20ZA0004\E\EDData\testbcp.csv'
WITH (FIELDTERMINATOR = ',',
      ROWTERMINATOR = '\n') 

我的.CSV 看起来像这样:

john,smith
jane,doe

CSV 以 UTF-8 编码保存,文件底部没有空行。我也批量插入的表也是空的。

表格有两列; firstname (nvarchar(max))secondname (nvarchar(max))

我在服务器上拥有sysadmin 权限,因此有权执行批量插入。

运行SQL时,运行无误,简单显示-

0 行受影响

并且不插入任何信息。

非常感谢任何帮助。

【问题讨论】:

  • .CSV是Excel表格,请确认。
  • 我用示例.CSV 尝试了您的代码,它运行良好。
  • 嘿,OP,您的 SQL 服务器似乎无法通过网络看到该位置,或者它可以看到并且您缺乏权限...最好与您的 DBA 交谈

标签: sql sql-server bulkinsert


【解决方案1】:

我知道这可能为时已晚,但我认为这可能会帮助任何正在寻找解决方案的人。我在批量插入时遇到了类似的问题,但没有在网上找到任何修复。很可能 flat/csv 文件是使用非 Windows 格式生成的。如果您可以在 Notepad++ 中打开该文件,则转到编辑选项卡并将 EOL 转换更改为“Windows 格式”。这解决了我的问题。

Notepad++>> 编辑>> EOL 转换>> Windows 格式

【讨论】:

  • 这对我有用。干杯!
【解决方案2】:

当您将 \n 指定为批量导出的行终止符或隐式使用默认行终止符时,它会输出一个回车换行符组合 (CRLF) 作为行终止符。如果您只想输出一个换行符 (LF) 作为行终止符——这在 Unix 和 Linux 计算机上很典型——使用十六进制表示法来指定 LF 行终止符。例如: ROWTERMINATOR='0x0A'

无需执行以下操作: Notepad++>> 编辑>> EOL 转换>> Windows 格式

【讨论】:

  • 当 GEE 文件为 csv 格式时,此解决方案(特别是 ROWTERMINATOR='0x0A')可将 Google 地球引擎导入 SqlServer。谢谢。
【解决方案3】:

我用 Excel 打开了 CSV,然后按 Control + S 重新保存它。这解决了我的问题。

【讨论】:

    【解决方案4】:

    先尝试使用bcp.exe 插入文件,看看是否有任何行或任何错误。

    的问题
    BULK INSERT ...
    FROM '\\REMOTE\SHARE\...'
    

    是您现在正在考虑模拟和委托安全性,并且更难以诊断问题。当您访问这样的远程共享时,您实际上是在进行“双跳”Kerberos 模拟(又名委托),您需要设置特殊的安全性。阅读Bulk Insert and Kerberos了解详情。

    【讨论】:

      【解决方案5】:

      问题至少部分是 UTF-8 编码。默认情况下不支持。如果您使用的是 SQL Server 2016,那么您可以指定代码页 65001(即将, CODEPAGE = '65001' 添加到WITH 子句)。如果使用较早版本的 SQL Server,则需要先将文件编码转换为 UTF-16 Little Endian(在 Microsoft 世界中称为“Unicode”)。这可以在保存文件时完成,也可以通过某些命令行实用程序完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        • 1970-01-01
        相关资源
        最近更新 更多