Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 批量插入需要转换的数据时使用哪种方法(性能)_Sql_Datetime_Bcp - Fatal编程技术网

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

Sql 批量插入需要转换的数据时使用哪种方法(性能),sql,datetime,bcp,Sql,Datetime,Bcp,我每天都要将数据从文件导入SQL Server数据库表。我研究了大量插入的不同方法,我的想法是通过每天运行计划任务,从命令行使用bcp实用程序 我最大的问题是,在使用bcp导入数据时,我不知道如何或是否可能转换日期。例如,我有一个格式为dd.mm.yyyy的日期字段,我无法将其存储为SQLdatetime类型 该文件每天更新(当前约有200万行或255MB数据),其工作方式是每天创建一个新文件,其中包含所有以前的数据和文件末尾的一些新数据。文件的第一行包含数据的标题。下面的数据以分号分隔,每行以

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

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

该文件每天更新(当前约有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,正如一篇教程所建议的那样:数千行什么都不是。使用任何你喜欢的插入方法。而且,这个问题被反复问。你可以通过搜索找到所有可能的答案。我遇到的具体问题是以点作为分隔符的日期格式。我不确定在数千行的情况下,所需的转换是否会导致性能下降。谢谢你的宝贵意见。我想补充一点,我不确定每次是导入整个文件还是只导入新行。我读过一种方法,将所有数据导入一个临时表,并用它替换上一个表。这就是为什么被问到,因为我不知道做我想做的事情的最佳方式。这只需要起作用,不一定是最好的方法。