大家好我在嘗試從文本文件導入數據時使用BULK INSERT
命令時遇到了一個難題。用格式文件和批量插入導入SQL Server
我在網上發現了很多關於用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
);
對於Oracle:
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');
的錯誤是:
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 2, column 2 (begin_time).
我搜索了這個問題,嘗試將datetime更改爲smalldate,嘗試將長度更改爲23或24.它不起作用。所以我嘗試導入另一個表中沒有日期,我用數字列和字符列,但我面臨着與數字列了同樣的問題:
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 2, column 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 row(s) affected)
我也試着做例子http://msdn.microsoft.com/en-us/library/ms178129.aspx,但臉上帶着錯誤:
Cannot bulk load because the file "D:\myTest.txt" could not be read. Operating system error code (null).
而最後,我試圖用bcp
這個程序和麪對錯誤。
任何人都可以幫助我解決我的問題,或者給我至少一個使用批量插入和格式文件的工作示例。
P.S.我使用MS SQL Server 2005更新到最新版本。操作系統是Windows 7 x64。
您是否試圖跳過源數據中的任何列?儘管能夠在格式文件中命名列,但我認爲它不重要(我可能是錯的)。它依賴於列的序號位置。我使用XML格式文件和'openrowset'方法獲得了最好的運氣。 – gangreen 2012-03-06 08:31:14