使用带有BULK INSERT的FORMATFILE的问题 - 转换数字

时间:2014-08-25 04:58:37

标签: sql-server

尝试将BULK INSERT与SQL Server一起使用。

我有一张这样的表:

CREATE TABLE AA
(
    AA_ID       int identity    NOT NULL,
    B_ID            int             NOT NULL,
    QUALITY_CODE      nvarchar(4),
    VALUE_NUM         numeric(18,4)
)

这样的格式文件:

10.0
3
1       SQLINT              0       0     "\t"   2     B_ID             ""
2       SQLNCHAR            0       0     "\t"   3     QUALITY_CODE     Latin1_General_CI_AS
3       SQLNUMERIC          0       0     "\r\n"   4     VALUE_NUM      ""

和这样的数据文件:

6   OK  50.0000
6   OK  49.0000
6   OK  1023.0000
6   OK  340.0000

当我发表这个声明时:

BULK INSERT dbo.AA
FROM 'C:/path/aa.dat'
WITH (  FORMATFILE = 'C:/path/aa.fmt')

我收到此错误:

[Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid data for type "numeric"(SQL-42000) [state was 42000 now 01000]
  • 我检查过我的数据文件有CR LF行结尾。
  • 我检查过我的数据文件在每个字段之间都有制表符。

我无法弄清楚出了什么问题。

我的代码和文件位于:https://github.com/rjattrill/MsSql_BulkInsertExample

1 个答案:

答案 0 :(得分:1)

我发现最好的方法是使用OPENROWSET将大多数内容导入为VARCHAR,然后允许INSERT自动转换。使用批量实用程序的内置数据类型转换看起来很难记录并且难以使用。使用SELECT FROM OPENROWSET将大多数内容导入VARCHAR更容易,然后允许内置DML功能在INSERT阶段进行转换 - 但可能会以某些性能为代价。

这是一个更新的格式文件:

10.0
4
1       SQLINT              0       0     "\t"   2     B_ID             ""
2       SQLCHAR            0       0     "\t"   3     PERIOD_START     Latin1_General_CI_AS
3       SQLCHAR            0       0     "\t"   4     QUALITY_CODE     Latin1_General_CI_AS
4       SQLCHAR          0       0     "\r\n"   5     VALUE_NUM      ""

使用它的代码:

INSERT INTO dbo.AA (B_ID, PERIOD_START, QUALITY_CODE, VALUE_NUM)
SELECT a.* FROM OPENROWSET(
BULK 'C:/src_github/MsSql_BulkInsertExample/aa.dat',
FORMATFILE = 'C:/src_github/MsSql_BulkInsertExample/aa.fmt',
FIRSTROW = 1
) as a

此处的完整示例:https://github.com/rjattrill/MsSql_BulkInsertExample