BCP 格式文件批量导入 SQL 服务器抛出 ODBC 错误

BCP Format file to bulk import in SQL Server throws ODBC error

当我执行下面的 bcp 命令将数据从 .csv 文件导入我 SQL 服务器中的 table 时,我收到一个 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 中的 table 结构:

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 命令时遇到的错误:

Error = [Microsoft][ODBC Driver 11 for SQL Server]
Unexpected EOF encountered in BCP data file

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

.

这里是 .csv 文件中的一行数据(我需要在 SQL 服务器 table 中不带双引号):

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

我终于弄明白了。我只需要通过添加一个 'space' 作为我最后一列的字段终止符来修改格式文件。我没有注意到在我的最后一列之后有一个 space,并且在每一行的每个最后一项之后都有一个 space。此外,我需要在我的格式文件中添加一个额外的列,该列以双引号作为分隔符,为此我将列号设置为 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 以跳过 header:)

    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'

SELECT @错误