我有一个基本的 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 格式)。