我每天都要处理从一个文件导入数据到SQL Server数据库表的任务。我研究了大量插入的不同方法,我的想法是通过每天运行一个计划任务从命令行使用bcp
实用程序。
我最大的问题是我不知道如何使用bcp导入数据时甚至可以转换日期。例如,我有dd.mm.yyyy
格式的日期字段,我无法将其存储为SQL datetime
类型。
该文件每天更新(它目前有大约200万行或255 MB数据),其工作方式是每天创建一个新文件,其中包含文件末尾的所有先前数据和一些新数据。该文件的第一行包含数据的标头。随后的数据以分号分隔,每行以\n
结尾。真实文件有16列,所以我在一个例子中简化了它:
data.txt:
NUMBER;START_DATE;END_DATE;GROUP_ID;IS_OPEN;TOTAL;
2262101;02.10.2010;01.11.2010;123456789012345678;0;268,75;
2291245;01.11.2010;01.12.2010;123456789012345678;0;67,25;
etc...
我创建的格式文件如下所示(也是一个列数较少的示例)。我目前没有将日期导入为SQLDATETIME,因为由于格式(DD.MM.YYYY),它似乎不可能。
format.fmt:
10.0
4
1 SQLINT 0 0 "" 1 Id ""
2 SQLCHAR 0 4 ";" 2 Number ""
3 SQLCHAR 0 50 ";" 3 StartDate Finnish_Swedish_CI_AS
4 SQLCHAR 0 50 ";" 4 EndDate Finnish_Swedish_CI_AS
5 SQLCHAR 0 20 ";" 5 GroupId Finnish_Swedish_CI_AS
6 SQLBIT 0 1 ";" 6 IsOpen ""
7 SQLDECIMAL 0 18 "\n" 7 Total ""
对于命令,我指定表/ db,数据文件,格式文件,-T =可信连接和-F =第一行2以跳过标题行。
在cmd中:
bcp [database].[dbo].[table] in C:\...\data.txt -f C:\...\format.fmt -T -F 2
数据库表:
CREATE TABLE [dbo].[table](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Number] [int] NOT NULL,
[StartDate] [varchar](50) NULL,
[EndDate] [varchar](50) NULL,
[GroupId] [varchar](50) NULL,
[IsOpen] [bit] NULL,
[Total] [decimal](18, 2) NULL
我的想法是将日期保存为字符串,但使用CAST(StartDate as datetime)
阅读它们,但这似乎不适用于dd.mm.yyyy
格式。我也试过执行set dateformat dmy
。
因此,我需要每天自动导入数千行到数据库表中,我需要在此过程中将日期转换为日期时间。什么是(表现明智)最好的方法呢?是否有可能以有效的方式实现bcp?