0

我每天都负责将文件中的数据导入 SQL Server 数据库表的任务。我研究了进行批量插入的不同方法,我的想法是bcp通过每天运行计划任务从命令行使用该实用程序。

我最大的问题是我不知道如何在使用 bcp 导入数据时转换日期,或者是否可以转换日期。例如,我有一个格式的日期字段dd.mm.yyyy,我无法将其存储为 SQLdatetime类型。

该文件每天更新​​(目前大约有 200 万行或 255 MB 数据),其工作方式是每天创建一个新文件,其中包含所有以前的数据和文件末尾的一些新数据。文件的第一行包含数据的标题。后面的数据以分号分隔,每行以 . 结尾\n。真实文件有 16 列,所以我在一个例子中对其进行了简化:

数据.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) 似乎不可能。

格式.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 以跳过标题行。

在命令中:

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 有效地实现它吗?

4

1 回答 1

0

您可以使用 SQL Server 集成服务吗?

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

SSIS

于 2013-10-23T14:17:19.593 回答