我有一个运行SQL查询的基本SSIS作业,并将查询结果导出到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服务器端没有任何改变,但是我再也不知道在哪里要求他看。
其他信息:
答案 0 :(得分: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;
更容易