批量插入需要转换的数据时使用哪种方法(性能)

时间:2013-10-23 14:13:47

标签: sql datetime bcp

我每天都要处理从一个文件导入数据到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?

1 个答案:

答案 0 :(得分:0)

您是否可以使用SQL Server Integration Services?

SSIS允许您在导入期间轻松转换数据

SSIS