【问题标题】:BCP Format file to bulk import in SQL Server throws ODBC error要在 SQL Server 中批量导入的 BCP 格式文件引发 ODBC 错误
【发布时间】:2021-06-28 00:59:49
【问题描述】:

当我执行下面的bcp 命令将数据从.csv 文件导入到我在SQL Server 中的表中时,我收到了一个ODBC 错误。

命令如下:

DECLARE @Error INT

EXEC @Error = master..xp_cmdshell 'bcp DB.dbo.tbl_CASHBAL IN "H:\Imports\CASH BAL.csv" -f H:\CASHBAL.fmt -S myserver -U user -P xxxx'

SELECT @Error

这是SQL中的表结构:

CREATE TABLE [UBS].[dbo].tbl_BilotherCASHBALN 
(
    [DATE] VARCHAR(100),
    [SCODE] VARCHAR(100),
    [MY-ACC-N] VARCHAR(100),
    [YOUR-ACC-N] VARCHAR(100),
    [CASH-BAL] VARCHAR(100)
)

这是我的格式文件:

12.0
5
1       SQLCHAR             0       100     "\t"     1     DATE                 SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR             0       100     "\t"     2     SCODE               SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR             0       100     "\t"     3     MY-ACC-N              SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR             0       100     "\t"     4     YOUR-ACC-N              SQL_Latin1_General_CP1_CI_AS
5       SQLCHAR             0       100     "\r\n"   5     CASH-BAL             SQL_Latin1_General_CP1_CI_AS

这是我在执行bcp 命令时遇到的错误:

错误 = [Microsoft][ODBC Driver 11 for SQL Server]
在 BCP 数据文件中遇到意外的 EOF

我在此处包含了完整错误消息的屏幕截图:

.

这是来自.csv 文件的一行数据(我需要在没有双引号的 SQL Server 表中):

"2021-01-30","IX","0001234567","XYZ01234","2305123.19" 

【问题讨论】:

  • 您的文件说分隔符是制表符,但在文件中您有逗号?
  • 顺便说一句,你为什么要从带有xp_cmdshell 的 SQL 运行它,这会带来安全风险,只需从实际批处理或 Powershell SQL 代理作业运行它。
  • Jamez Z,设置格式文件的正确方法是什么,以便我的数据最终没有逗号,并且在运行我的 bcp 命令时不会出错?
  • bcp.exe 并不真正适用于引用的 CSV 文件。您需要将它们转换为未加引号的 CSV 文件(并将您的 "\t" 字段终止符更正为 ",")或使用不同的技术来读取您的数据,例如使用 Import-Csv 读取数据的 PowerShell 脚本。
  • 只需手动修改格式文件,指定分隔符不是“\t”(即制表符)即可。 bcp 正在寻找第一个选项卡以查找数据的第一个字段并且从未找到它......因此它尝试将所有数据加载到单个列中并在找到单​​个选项卡之前找到文件的结尾。这就是你的错误的意思。

标签: sql-server bcp


【解决方案1】:

我终于能够弄清楚这一点。我只需要通过添加一个“空格”作为我最后一列的字段终止符来修改格式文件。我没有注意到我的最后一列之后有一个空格,并且每行中的每个最后一个项目之后都有一个空格。另外,我需要在我的格式文件中添加一个额外的以双引号作为分隔符的列,为此我将列号设置为 0,因此它不会被导入。带有适当字段终止符的最终格式文件如下所示:

    8.0
    6
    1       SQLCHAR             0       1    "\""         0   Unwanted         ""
    1       SQLCHAR             0       100     "\",\""     1     DATE                         SQL_Latin1_General_CP1_CI_AS
    2       SQLCHAR             0       100     "\",\""     2     SCODE               SQL_Latin1_General_CP1_CI_AS
    3       SQLCHAR             0       100     "\",\""     3     MY-ACC-N              SQL_Latin1_General_CP1_CI_AS
    4       SQLCHAR             0       100     "\",\""     4     YOUR-ACC-N              SQL_Latin1_General_CP1_CI_AS
    5       SQLCHAR             0       100     "\" "   5     CASH-BAL             SQL_Latin1_General_CP1_CI_AS

SQL Server Management Studio 中的执行行看起来像这样(我添加了 F 2 以跳过标题:)

    DECLARE @Error INT
    EXEC @Error = master..xp_cmdshell 'bcp DB.dbo.tbl_CASHBAL IN "H:\Imports\CASH BAL.csv" -f H:\CASHBAL.fmt -F 2 -S myserver -U user -P xxxx'

选择@错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多