【发布时间】:2012-03-06 08:13:35
【问题描述】:
大家好,当我尝试从文本文件导入数据时,我在使用BULK INSERT 命令时遇到了一个难题。
我在网上找到了很多关于使用BULK INSERT 或BCP 程序导入的文章和示例,但它们对我没有帮助。
问题:
我从 Oracle 导出到带有列分隔符 {#} 和行分隔符 <#> 的文本文件,然后将其导入 SQL Server。
表是(SQL Server):
CREATE TABLE my_DATA
(
ID_PK NUMERIC(30) NOT NULL ,
BEGIN_TIME DATETIME NULL ,
END_TIME DATETIME NULL
);
对于甲骨文:
CREATE TABLE my_DATA
(
ID_PK NUMBER(30) NOT NULL ,
BEGIN_TIME TIMESTAMP NULL ,
END_TIME TIMESTAMP NULL
);
带分隔符的文件是:
ID_PK{#}BEGIN_TIME{#}END_TIME<#>296167{#}01/01/2012 01:30:00.000{#}01/01/2012 02:00:00.000<#>296178{#}01/01/2012 02:00:00.000{#}01/01/2012 02:30:00.000<#>
格式文件为:
9.0
3
1 SQLNUMERIC 0 19 {#} 1 ID_PK ""
2 SQLDATETIME 0 8 {#} 2 BEGIN_TIME ""
3 SQLDATETIME 0 8 <#> 3 END_TIME ""
所以当我使用命令时:
BULK INSERT my_DATA
FROM 'D:\my_DATA.txt'
WITH
(CODEPAGE = '1251',
FIELDTERMINATOR = '{#}',
FIRSTROW = 2,
ROWTERMINATOR = '<#>' );
它可以工作,但是当我尝试使用格式文件时它不起作用:
BULK INSERT my_DATA
FROM 'D:\my_DATA.txt'
WITH (CODEPAGE = '1251',
FORMATFILE ='D:\format_file.txt');
错误是:
批量加载数据转换错误(类型不匹配或无效字符 对于指定的代码页)第 2 行第 2 列(开始时间)。
我搜索了这个问题,尝试将datetime更改为smalldate,尝试将length更改为23或24。它不起作用。所以我尝试导入另一个没有日期的表,我使用数字列和字符列,但我遇到了与数字列相同的问题:
批量加载数据转换错误(类型不匹配或无效字符 对于指定的代码页)对于第 2 行第 1 列 (id_pk)。
表:
CREATE TABLE unit_table
(
id_pk NUMERIC(30) NOT NULL ,
name NVARCHAR(200) NULL ,
name_full NVARCHAR(200) NULL ,
CONSTRAINT PK_unit_table_2C1 PRIMARY KEY (bule_biz_unit_level_id_pk)
);
格式化文件:
9.0
3
1 SQLNUMERIC 0 1 "{#}" 1 id_pk ""
2 SQLNCHAR 0 11 "{#}" 2 name ""
3 SQLNCHAR 0 11 "{#}" 3 name_full ""
数据文件只包含3行(批量插入命令同理):
ID_PK{#}NAME{#}NAME_FULL<#>1{#}factory{#}factory<#>2{#}station{#}station<#>
如果文件只包含 2 行会很有趣:
ID_PK{#}NAME{#}NAME_FULL<#>1{#}factory{#}factory<#>
批量插入的结果是:
(0 行受影响)
我也尝试做示例http://msdn.microsoft.com/en-us/library/ms178129.aspx,但面临错误:
无法批量加载,因为无法读取文件“D:\myTest.txt”。 操作系统错误代码(空)。
最后,我尝试将它与bcp 程序一起使用,但也遇到了错误。
谁能帮我解决我的问题,或者至少给我一个关于批量插入和格式化文件的工作示例。
附:我使用更新到最新版本的 MS SQL Server 2005。操作系统是 Windows 7 x64。
【问题讨论】:
-
您是否要跳过源数据中的任何列?尽管能够在格式文件中命名列,但我认为这并不重要(我可能是错的)。它依赖于列的序数位置。我在使用 XML 格式文件和
openrowset方法时获得了最好的运气。
标签: sql-server-2005 import bulkinsert file-format bcp