Sql 批量插入需要转换的数据时使用哪种方法(性能)
我每天都要将数据从文件导入SQL Server数据库表。我研究了大量插入的不同方法,我的想法是通过每天运行计划任务,从命令行使用Sql 批量插入需要转换的数据时使用哪种方法(性能),sql,datetime,bcp,Sql,Datetime,Bcp,我每天都要将数据从文件导入SQL Server数据库表。我研究了大量插入的不同方法,我的想法是通过每天运行计划任务,从命令行使用bcp实用程序 我最大的问题是,在使用bcp导入数据时,我不知道如何或是否可能转换日期。例如,我有一个格式为dd.mm.yyyy的日期字段,我无法将其存储为SQLdatetime类型 该文件每天更新(当前约有200万行或255MB数据),其工作方式是每天创建一个新文件,其中包含所有以前的数据和文件末尾的一些新数据。文件的第一行包含数据的标题。下面的数据以分号分隔,每行以
bcp
实用程序
我最大的问题是,在使用bcp导入数据时,我不知道如何或是否可能转换日期。例如,我有一个格式为dd.mm.yyyy
的日期字段,我无法将其存储为SQLdatetime
类型
该文件每天更新(当前约有200万行或255MB数据),其工作方式是每天创建一个新文件,其中包含所有以前的数据和文件末尾的一些新数据。文件的第一行包含数据的标题。下面的数据以分号分隔,每行以\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)的原因,这似乎不可能 格式。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 ""
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
对于命令,我指定table/db、数据文件、格式文件,-T=Trusted connection和-F=First row 2跳过标题行 在cmd中:
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 ""
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
数据库表:
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 ""
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有效地实现吗?您能够使用SQL Server集成服务吗 SSI允许您在导入期间轻松转换数据
我相信这是可以安排的。我目前正在阅读有关它的文章,但我想我会发布这个问题,看看是否有办法使用bcp,因为我已经尝试了很长一段时间了:)所以我在数据库服务器上进行了检查,有一个文件夹集成服务选项:Data Profile Viewer,Deployment Wizard,执行包实用程序和项目转换向导。我找不到SQLServerBusinessIntelligenceDevelopmentStudio,正如一篇教程所建议的那样:数千行什么都不是。使用任何你喜欢的插入方法。而且,这个问题被反复问。你可以通过搜索找到所有可能的答案。我遇到的具体问题是以点作为分隔符的日期格式。我不确定在数千行的情况下,所需的转换是否会导致性能下降。谢谢你的宝贵意见。我想补充一点,我不确定每次是导入整个文件还是只导入新行。我读过一种方法,将所有数据导入一个临时表,并用它替换上一个表。这就是为什么被问到,因为我不知道做我想做的事情的最佳方式。这只需要起作用,不一定是最好的方法。