Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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/2/ssis/2.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 server 比较SSIS包的OLE源中的日期_Sql Server_Ssis_Datediff - Fatal编程技术网

Sql server 比较SSIS包的OLE源中的日期

Sql server 比较SSIS包的OLE源中的日期,sql-server,ssis,datediff,Sql Server,Ssis,Datediff,我试图创建一个SSIS包,它通过对照包变量(User::LastUpdate)检查表中的日期字段(MODIFYDATE),从数据库中提取一组记录。选择MODIFYDATE等于或在LastUpdate之后的记录 我试过两种方法,使用DateDiff和一个返回位的UDF(都使用秒作为间隔),两种方法都遇到了相同的问题。日期匹配似乎推迟了两天 如果LastUpdate设置为1/22/2013 0:00,则应返回两条记录,一条记录的修改日期为1/22/2013 14:47,另一条记录的修改日期为1/22

我试图创建一个SSIS包,它通过对照包变量(User::LastUpdate)检查表中的日期字段(MODIFYDATE),从数据库中提取一组记录。选择MODIFYDATE等于或在LastUpdate之后的记录

我试过两种方法,使用DateDiff和一个返回位的UDF(都使用秒作为间隔),两种方法都遇到了相同的问题。日期匹配似乎推迟了两天

如果LastUpdate设置为1/22/2013 0:00,则应返回两条记录,一条记录的修改日期为1/22/2013 14:47,另一条记录的修改日期为1/22/2013 15:34。但除非将LastUpdate设置为不晚于2013年1月20日12:00,否则不会返回这两个值。如果设置早于此,它们都会返回。如果晚一点,两个人都不会回来

这些行被拉入SSIS包中的OLE DB源组件中。如果我进入查询生成器并从那里运行查询,手动提供日期,将返回正确的行。我已经插入了一个断点,并确认LastUpdate在提取行时包含正确的日期(LastUpdate的值由包中前面的存储过程提供)

这是目前的问题

SELECT ACTIVITIES.*
FROM ACTIVITIES LEFT OUTER JOIN
ArchivedEvents ON ACTIVITIES.FBC_EVENTSID = 
    ArchivedEvents.FBC_EVENTSID
WHERE (dbo.IsDateInOrder(?, ACTIVITIES.MODIFYDATE) = 1) OR
(dbo.IsDateInOrder(?, ArchivedEvents.MODIFYDATE) = 1)
还有我创建的函数

CREATE FUNCTION [dbo].[IsDateInOrder] 
(
    @Date1 DateTime,
    @Date2 DateTime
)
RETURNS bit
AS
BEGIN
    DECLARE @retval bit

    if DATEDIFF(s, @Date1, @Date2) >= 0
        SET @retval = 1
    else
        SET @retval = 0

    RETURN @retval

END

GO

正如您所知道的,通过像在WHERE子句中那样将函数包装在列周围,将强制进行表扫描,这可能会非常昂贵。在这种情况下,逻辑通常会产生更好的性能。为了验证,您已经映射了该参数两次,是吗?OLE DB连接管理器是基于顺序的,而ADO.NET将使用命名参数。@Billinkc-我不太担心成本。这意味着每天运行几次,最多,运行只需几秒钟。是的,必须检查两个不同的表格,而且两次都是同一个日期。我应该在问题描述中提到这一点。你能分析一下服务器上的proc调用,看看到底传递了什么吗?@Kevin-你是说UDF吗?这正是我遇到的问题。我不知道怎样才能得到那个信息。它不允许我从函数内部写入表,也不允许调用这样做的存储过程。我不知道如何查看实时运行的函数。我正在使用SQL Server 2008 R2和Management Studio,如果您能告诉我如何操作的话。