SSIS SQL 任务查询在转换参数时创建错误(字符串到日期时间)

SSIS SQL task Query creating error while casting parameters (string to Datetime)

我有两个DimDate参数(都是字符串):

我的参数映射是(都是NVARCHAR):

和我在 DimDate SQL 任务中的查询:

WITH DimDateCTE AS
(
    SELECT CAST ( ? AS DateTime) FullDate
    UNION ALL
    SELECT 
        FullDate + 1
    FROM
        DimDateCTE
    WHERE
        FullDate + 1 <= ?
)
INSERT INTO [dbo].[DimDate]
SELECT
    CAST(CONVERT(CHAR(8), CAST(FullDate AS DATETIME), 112) AS INT) AS DateKey,
    FullDate AS FullDateAlternateKey,
    DATEPART(dw, FullDate) AS DayNumberOfWeek,
    DATENAME(dw, FullDate) AS EnglishDayNameOfWeek,
    '' AS SpanishDayNameOfWeek,
    '' AS FrenchDayNameOfWeek,
    DAY(FullDate) AS DayNumberOfMonth,
    DATEPART(dy, FullDate) AS DayNumberOfYear,
    DATEPART(wk, FullDate) AS WeekNumberOfYear,
    DATENAME(mm, FullDate) AS EnglishMonthName,
    '' AS SpanishMonthName,
    '' AS FrenchMonthName,
    MONTH(FullDate) AS MonthNumberOfYear,
    DATEPART(qq, FullDate) AS CalenderQuarter,
    YEAR(FullDate) AS CalenderYear,
    CASE WHEN MONTH(FullDate) >= 1 AND MONTH(FullDate) <=6 THEN 1 ELSE 2 END AS CalendarSemester,
    DATEPART(quarter, FullDate) AS FiscalDate,
    YEAR(FullDate) AS FiscalYear,
    (MONTH(FullDate+3)/4) AS FiscalSemester
FROM
    DimDateCTE
OPTION(MAXRECURSION 0)
GO

你可以看到我的查询中有两个 ?标记,其中BeginGenerateDateEndGenerateDate参数值应该是动态插入的.第一个应该从字符串转换为 DateTime,第二个应该与 EndDate 进行比较。但是当我执行这个任务时,它总是在输出中抛出一个错误

SSIS package "C:\Users\raihan\documents\visual studio 2013\Projects-463 Implementing Datawarehouses-PackageLogic\DimDate.dtsx" starting.
Error: 0xC002F210 at Load DimDate, Execute SQL Task: Executing the query "
" failed with the following error: "Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly. Task failed: Load DimDate SSIS package "C:\Users\raihan\documents\visual studio 2013\Projects-463 Implementing Datawarehouses-PackageLogic\DimDate.dtsx" finished: Success.

以下 SQL 查询可以工作,但它不满足我的要求,如您所见,我无法插入我的参数

WITH DimDateCTE AS
(
    SELECT CAST ('2000-01-01' AS DateTime) FullDate
    UNION ALL
    SELECT 
        FullDate + 1
    FROM
        DimDateCTE
    WHERE
        FullDate + 1 <= '2020-12-31'
)
INSERT INTO [dbo].[DimDate]
SELECT
    CAST(CONVERT(CHAR(8), CAST(FullDate AS DATETIME), 112) AS INT) AS DateKey,
    FullDate AS FullDateAlternateKey,
    DATEPART(dw, FullDate) AS DayNumberOfWeek,
    DATENAME(dw, FullDate) AS EnglishDayNameOfWeek,
    '' AS SpanishDayNameOfWeek,
    '' AS FrenchDayNameOfWeek,
    DAY(FullDate) AS DayNumberOfMonth,
    DATEPART(dy, FullDate) AS DayNumberOfYear,
    DATEPART(wk, FullDate) AS WeekNumberOfYear,
    DATENAME(mm, FullDate) AS EnglishMonthName,
    '' AS SpanishMonthName,
    '' AS FrenchMonthName,
    MONTH(FullDate) AS MonthNumberOfYear,
    DATEPART(qq, FullDate) AS CalenderQuarter,
    YEAR(FullDate) AS CalenderYear,
    CASE WHEN MONTH(FullDate) >= 1 AND MONTH(FullDate) <=6 THEN 1 ELSE 2 END AS CalendarSemester,
    DATEPART(quarter, FullDate) AS FiscalDate,
    YEAR(FullDate) AS FiscalYear,
    (MONTH(FullDate+3)/4) AS FiscalSemester
FROM
    DimDateCTE
OPTION(MAXRECURSION 0)
GO

SQL 服务器中的我的 DimDate table 结构是:

我已经将问题视频上传到 Youtube Here is the Link

我能发现的一个问题是您的变量值似乎不包含值周围的任何引号 - Integration Services 将把这些文字值替换到您的查询中并且没有引号您将要结束的内容最多是:

SELECT CAST ( 1/1/2000 AS DateTime) FullDate
UNION ALL
SELECT 
    FullDate + 1
FROM
    DimDateCTE
WHERE
    FullDate + 1 <= 12/31/2020

这会出错,因为日期值需要用单引号括起来才能被视为字符串。

您可以将引号放在变量值中,例如将值“1/1/2000”(包括引号)存储在变量中,或者您可以编辑 SQL 语句以将它们附加到变量值。

我找到了解决方案,但仍然不知道它是如何工作的:D ...... 在使用 CTE 之前,我必须将参数分别转换为 DateTimeDate

DECLARE @startDate DateTime;
SET @startDate = CAST (? AS DateTime);

DECLARE @endDate  Date;
SET @endDate = CAST (? AS Date);

以下代码运行良好

DECLARE @startDate DateTime;
SET @startDate = CAST (? AS DateTime);

DECLARE @endDate  Date;
SET @endDate = CAST (? AS Date);

WITH DimDateCTE AS
(
    SELECT  @startDate AS FullDate
    UNION ALL
    SELECT 
        FullDate + 1
    FROM
        DimDateCTE
    WHERE
        FullDate + 1 <= @endDate 
)
INSERT INTO [dbo].[DimDate]
SELECT
    CAST(CONVERT(CHAR(8), CAST(FullDate AS DATETIME), 112) AS INT) AS DateKey,
    FullDate AS FullDateAlternateKey,
    DATEPART(dw, FullDate) AS DayNumberOfWeek,
    DATENAME(dw, FullDate) AS EnglishDayNameOfWeek,
    '' AS SpanishDayNameOfWeek,
    '' AS FrenchDayNameOfWeek,
    DAY(FullDate) AS DayNumberOfMonth,
    DATEPART(dy, FullDate) AS DayNumberOfYear,
    DATEPART(wk, FullDate) AS WeekNumberOfYear,
    DATENAME(mm, FullDate) AS EnglishMonthName,
    '' AS SpanishMonthName,
    '' AS FrenchMonthName,
    MONTH(FullDate) AS MonthNumberOfYear,
    DATEPART(qq, FullDate) AS CalenderQuarter,
    YEAR(FullDate) AS CalenderYear,
    CASE WHEN MONTH(FullDate) >= 1 AND MONTH(FullDate) <=6 THEN 1 ELSE 2 END AS CalendarSemester,
    DATEPART(quarter, FullDate) AS FiscalDate,
    YEAR(FullDate) AS FiscalYear,
    (MONTH(FullDate+3)/4) AS FiscalSemester
FROM
    DimDateCTE
OPTION(MAXRECURSION 0)