尝试将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]
我无法弄清楚出了什么问题。
我的代码和文件位于:https://github.com/rjattrill/MsSql_BulkInsertExample
答案 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