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 @错误
当我执行下面的 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 @错误