gotchaMinor
Why does SQL Server 2008 R2 insert an invalid datetime when using bulk insert?
Viewed 0 times
whyinsert2008sqlbulkusingdoeswhenserverinvalid
Problem
I want to insert rows with an optional datetime value (per row) using T-SQL BULK INSERT
on a SQL Server 2008 R2.
A table could look like this:
The insert batch:
If I am to insert the following CSV content:
The table' content was parsed and inserted as expected:
But if the CSV file contains invalid data for the optional datetime
SQL Server inserts the last valid datetime value instead of discarding the row with an error message:
If I am to insert a row with an invalid datetime and no valid parsable datetime at all
SQL Server inserts the default value of DATETIME:
Why does Sql Server insert the (for that specific row) invalid datetime when using bulk insert?
If
on a SQL Server 2008 R2.
A table could look like this:
CREATE TABLE [dbo].[tbl_bulk_insert_datetime_issue] (
[id] [int] NOT NULL,
[description] [varchar](20) NOT NULL,
[datetime] [datetime] NULL,
CONSTRAINT [pk_bulk_insert_datetime_issue] PRIMARY KEY CLUSTERED (
[id] ASC
))The insert batch:
BULK
INSERT [dbo].[tbl_bulk_insert_datetime_issue]
FROM 'C:\temp\bulkinsertsample.csv'
WITH
(
FIELDTERMINATOR=';'
)If I am to insert the following CSV content:
1;row01;
2;row02;20130401
3;row03;
4;row04;20130515The table' content was parsed and inserted as expected:
id description datetime
----------- -------------------- -----------------------
1 row01 NULL
2 row02 2013-04-01 00:00:00.000
3 row03 NULL
4 row04 2013-05-15 00:00:00.000But if the CSV file contains invalid data for the optional datetime
1;row01;
2;row02;20130401
3;row03;not_a_datetime
4;row04;20130515SQL Server inserts the last valid datetime value instead of discarding the row with an error message:
id description datetime
----------- -------------------- -----------------------
1 row01 NULL
2 row02 2013-04-01 00:00:00.000
3 row03 2013-04-01 00:00:00.000
4 row04 2013-05-15 00:00:00.000If I am to insert a row with an invalid datetime and no valid parsable datetime at all
1;row01;not_a_datetimeSQL Server inserts the default value of DATETIME:
id description datetime
----------- -------------------- -----------------------
1 row01 1900-01-01 00:00:00.000Why does Sql Server insert the (for that specific row) invalid datetime when using bulk insert?
If
Solution
On SQL Server 2005, and SQL Server 2012, I did the following:
With the following data:
On both servers, I received the following:
Perhaps, as Aaron noted, this is a bug that needs to be addressed through http://connect.microsoft.com
I'm wondering about some of the details of your system, including locale settings, collations, physical format of the import file (is it from a Unix system? etc).
USE tempdb;
CREATE TABLE ImpTest
(
ImpTestID INT NULL
, ImpTestDate DATETIME NULL
);
GO
BULK INSERT ImpTest FROM 'C:\SQLServer\ImportTest.txt' WITH (FIELDTERMINATOR=',');
SELECT * FROM ImpTest;
DROP TABLE ImpTest;With the following data:
1,
2,20130406
3,NOT_DATE
4,
5,20130409On both servers, I received the following:
Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified
codepage) for row 3, column 2 (ImpTestDate).Perhaps, as Aaron noted, this is a bug that needs to be addressed through http://connect.microsoft.com
I'm wondering about some of the details of your system, including locale settings, collations, physical format of the import file (is it from a Unix system? etc).
Code Snippets
USE tempdb;
CREATE TABLE ImpTest
(
ImpTestID INT NULL
, ImpTestDate DATETIME NULL
);
GO
BULK INSERT ImpTest FROM 'C:\SQLServer\ImportTest.txt' WITH (FIELDTERMINATOR=',');
SELECT * FROM ImpTest;
DROP TABLE ImpTest;1,
2,20130406
3,NOT_DATE
4,
5,20130409Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified
codepage) for row 3, column 2 (ImpTestDate).Context
StackExchange Database Administrators Q#52759, answer score: 4
Revisions (0)
No revisions yet.