0

我有一个基本的 SSIS 作业,它运行 SQL 查询并将查询结果导出到 Excel 文件。SSIS 作业已运行一年多没有问题,但本月开始失败(在验证阶段,执行前),并出现以下错误:

“从字符串转换日期和/或时间时转换失败。”

SQL 查询本身是一个带有 WHERE 子句的简单 SELECT,用于指定从中收集记录的开始和结束日期范围。确定日期范围的查询部分如下:

DECLARE     @RunDateTime datetime
DECLARE     @RunDate datetime
DECLARE     @StartDate datetime
DECLARE     @EndDate datetime
DECLARE     @Month int
DECLARE     @Year int
DECLARE     @strStartDate varchar(10)

SET     @RunDateTime = GetDate()
SET     @RunDate = CAST(@RunDateTime AS DATE)

IF                  DATEPART(d, @RunDate) = 16
    BEGIN       
                    SET @StartDate =  DATEADD(d, -15, @RunDate)
                    SET @EndDate = @RunDate
    END
ELSE
    BEGIN
                    IF      Month(@RunDate) = 1
                            SET @Month = 12
                    ELSE    
                            SET @Month = Month(@RunDate) - 1

                    IF      Month(@RunDate) = 1
                            SET @Year = Year(@RunDate) - 1
                    ELSE
                            SET @Year = Year(@RunDate)

                    SET @strStartDate = CAST(@Year AS VARCHAR) + CAST(@Month AS VARCHAR) + '16'
                    SET @StartDate = CONVERT(datetime, @strStartDate)
                    SET @EndDate = @RunDate
    END

我可以将此代码从 SSIS 中取出并通过 SSMS 直接在服务器上执行,它可以正常工作,没有错误。但是,SSIS 作业无法运行它。实际上,我什至无法进入 SQL 命令的 OLE DB Source 对象并查看列元数据,每次都会收到上述错误。

我发现通过注释掉该SET @StartDate = CONVERT(datetime, @strStartDate)行,查询在 SSIS 中再次起作用,但没有理由该行会引起问题。正如我所说,它已经工作了一年多,没有任何问题。我真的对此束手无策,无法理解为什么这项工作突然停止工作。

我确实与我的 DBA 进行了核对,他向我保证 SQL 服务器端没有任何更改,但是我什至不知道该去哪里找他。

其他信息:

  • SSIS 作业使用 SQLNCLI10.1 连接提供程序。(2008 R2 SQL 服务器)
  • 我尝试过使用其他连接提供程序,但没有成功。
  • 查询中涉及的日期列是日期时间类型
  • 没有会影响日期的区域/本地化更改。(并且所有日期都是 ISO 格式)。
4

1 回答 1

2

这会失败,因为@strStartDate 它不是有效的日期或不是可识别的格式。它不应该在 11 月、12 月或 1 月失败,但肯定会在 2 月到 10 月 ( Month(@RunDate) - 1) 期间失败,因为CAST(@Month AS VARCHAR)返回的只有一位数。

老实说,这是计算上个月 16 日的一个相当长的方法,你能把它改成…

DECLARE @StartDate DateTime

IF DATEPART(d, GetDate()) = 16
   SET @StartDate = DateAdd(mm, DateDiff(mm,0,GetDate()),0)
ELSE
   SET @StartDate = DateAdd(mm, DateDiff(mm,0,GetDate())-1,0)+15;

容易多了

于 2013-01-04T16:50:31.563 回答