我每天都负责将文件中的数据导入 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 有效地实现它吗?