Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
如何在SQLServer2008R2中提高从字符串中提取日期和时间的性能?_Sql_Sql Server_Tsql_Date_Parsing - Fatal编程技术网

如何在SQLServer2008R2中提高从字符串中提取日期和时间的性能?

如何在SQLServer2008R2中提高从字符串中提取日期和时间的性能?,sql,sql-server,tsql,date,parsing,Sql,Sql Server,Tsql,Date,Parsing,我正在使用SQL 2008数据库执行一项数据迁移任务(SSIS),在该任务中,我必须从字符串中提取日期和时间,并将其转换为日期时间数据类型字段,以便以后能够插入到表中 我在查询中使用的数据库中保存了一个SQL函数,它正确地解析字符串以输出正确的结果。唯一的主要问题是,查询大约需要一个半小时才能获得120000条记录。如果可以,请指出正确的方向,以确定是否需要更正查询或函数以显著提高性能 我使用字符串解析函数(fnExtradateTimeFromString)的查询是 在FnExtradDate

我正在使用SQL 2008数据库执行一项数据迁移任务(SSIS),在该任务中,我必须从字符串中提取日期和时间,并将其转换为日期时间数据类型字段,以便以后能够插入到表中

我在查询中使用的数据库中保存了一个SQL函数,它正确地解析字符串以输出正确的结果。唯一的主要问题是,查询大约需要一个半小时才能获得120000条记录。如果可以,请指出正确的方向,以确定是否需要更正查询或函数以显著提高性能

我使用字符串解析函数(fnExtradateTimeFromString)的查询是

在FnExtradDateTimeFromString函数中,我使用2个表变量来存储日期和时间格式的所有模式,然后使用patindex稍后连接日期和时间的字符串,并连接到日期时间字段。这是300多行函数,我不知道我可以粘贴在这里

字符串的一个示例是“User appt:7/27/94@10:30AM”,日期为1994年7月27日,时间为10:30。这些是用户输入字符串,因此它们在空格和分隔字符方面非常不一致。

正如@Shnugo所指出的,您正在为每行多次调用此“昂贵”函数

要确保只进行一次调用,请使用子查询:

select
    case when NoteDate is null then CAST('2000-01-01 00:00:00.000' as datetime)
        when NoteDate = CAST('1900-01-01' as date) then NoteDate + CAST('2000-01-01 00:00:00.000' as datetime)
        else NoteDate
    end as NoteDate,
    UsersNotes
from    
    ( select
        dbo.fnExtrDateTimeFromString(NoteList.Item) as NoteDate,
        CAST(LTRIM(RTRIM(NoteList.Item)) as text) as UsersNotes
    from UserNotes
        cross apply convDelimitedSplit(UserNotes.NoteText,',') as NoteList
    where LEN(ISNULL(UserNotes.Notes,'')) > 0 ) as a
注意:
text
数据类型已弃用,应使用VARCHAR(MAX)

如果这个日期分割功能是性能瓶颈,那么它应该是性能的两倍/三倍


读得好:

正如@Shnugo所指出的,您正在为每一行多次调用这个“昂贵”函数

要确保只进行一次调用,请使用子查询:

select
    case when NoteDate is null then CAST('2000-01-01 00:00:00.000' as datetime)
        when NoteDate = CAST('1900-01-01' as date) then NoteDate + CAST('2000-01-01 00:00:00.000' as datetime)
        else NoteDate
    end as NoteDate,
    UsersNotes
from    
    ( select
        dbo.fnExtrDateTimeFromString(NoteList.Item) as NoteDate,
        CAST(LTRIM(RTRIM(NoteList.Item)) as text) as UsersNotes
    from UserNotes
        cross apply convDelimitedSplit(UserNotes.NoteText,',') as NoteList
    where LEN(ISNULL(UserNotes.Notes,'')) > 0 ) as a
注意:
text
数据类型已弃用,应使用VARCHAR(MAX)

如果这个日期分割功能是性能瓶颈,那么它应该是性能的两倍/三倍


良好的阅读:

请发布您的查询计划并考虑DBA站点,如果我得到正确的结果,就会有一个列“代码> USENotes。NoTeTeX</代码>带有一个逗号分隔的注释列表。您可以调用
交叉应用
来实现拆分器功能。然后多次使用标量函数来提取所需的值。首先显示:请显示昂贵的代码(拆分器和den标量函数),第二:请提供cosumable(复制和粘贴)格式的示例数据。最好的方法是,这不是您应该在数据库中执行的操作。这个日期应该在客户端应用程序中解析,并作为一个不同的参数发送到SQL Server。FY:<代码>文本< /代码>数据类型被禁止,您应该使用<代码> VARCHAR(MAX)< /代码>请发布您的查询计划并考虑DBA站点,如果我得到这个正确的话,有一列
UserNotes.NoteText
,其中包含以逗号分隔的注释列表。您可以调用
交叉应用
来实现拆分器功能。然后多次使用标量函数来提取所需的值。首先显示:请显示昂贵的代码(拆分器和den标量函数),第二:请提供cosumable(复制和粘贴)格式的示例数据。最好的方法是,这不是您应该在数据库中执行的操作。应在客户端应用程序中解析此日期,并将其作为其他参数发送到SQL server中。仅供参考:
text
数据类型已弃用,您应使用
VARCHAR(MAX)
感谢@Alex和@Shnugo指出代码中的缺陷,并解释性能不佳的原因。将函数调用放入子查询将运行时间缩短为原始时间的一半,我正在学习有关如何在列列表和
where
子句中调用标量函数效率低下的新信息。感谢@Alex和@Shnugo指出代码中的缺陷并解释性能不佳的原因。将函数调用放入子查询将运行时间缩短为原始时间的一半,我正在学习有关如何在列列表和
where
子句中调用标量函数效率低下的新信息。