我有一个用于数据检索的 MS SQL Server 存储过程。
它由一个“父”存储过程组成,该存储过程具有月份和年份的输入参数。
我使用函数来获取“从”和“到”日期范围,然后将其直接传递到“子”存储过程以生成输出。
子存储过程具有 StartDate 和 EndDate 参数:
ALTER PROCEDURE
[dbo].[usp_MasterExtractV3]
(
@StartDate DATE = NULL,
@EndDate DATE = NULL
)
当我运行存储过程并手动填充这些参数时
EXECUTE usp_MasterExtractV3
@StartDate = '2023-04-01',
@EndDate = '2023-04-30'
在 SSMS 和 SSRS 报告中测试时,输出是正确的。
输出日期范围的表函数为变量年初日期范围生成以下数据(根据不从一月开始的年份输出日期范围)
Year Month MonthName StartDate EndDate
2024 3 March 2024-03-01 2024-03-31
2024 2 February 2024-02-01 2024-02-29
2024 1 January 2024-01-01 2024-01-31
2023 12 December 2023-12-01 2023-12-31
2023 11 November 2023-11-01 2023-11-30
2023 10 October 2023-10-01 2023-10-31
2023 9 September 2023-09-01 2023-09-30
2023 8 August 2023-08-01 2023-08-31
2023 7 July 2023-07-01 2023-07-31
2023 6 June 2023-06-01 2023-06-30
2023 5 May 2023-05-01 2023-05-31
2023 4 April 2023-04-01 2023-04-30
如果我使用这样的函数的输出:
SET @LocalStartDate = (SELECT Min(StartDate) FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear))
SET @LocalEndDate = (SELECT EndDate FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear) WHERE (Month = @localMonth))
我得到两个变量:
@LocalStartDate @LocalEndDate
2023-04-01 2023-04-30
如果我使用这些变量(而不是手动)调用存储过程,如下所示:
EXECUTE usp_MasterExtractV3
@StartDate = @LocalStartDate,
@EndDate = @LocalEndDate
SSMS 中的输出完全符合我的预期。它从四月份的数据返回数千行。
如果我从 SSRS 运行相同的内容,它会产生一月到四月的输出。
SSMS 和 SSRS 之间解释这些开始和结束日期的方式有所不同。
我可以将参数从“计算”更改为“手动”,并查看输出方差的变化。我认为这一定与一个是字符串而另一个是 SQL DATE 数据类型有关,但我不知道如何纠正这个问题。
函数和输出存储过程都在另一个存储过程中运行,充当独立的报告数据检索容器。理论上,SSRS 日期格式不应该影响这一点,因为它是一个自包含的 SQL 存储过程,在 SSMS 和 SSRS 中产生不同的输出。
进一步调查确认,当作为 DATE 字段从 SQL Server 函数的输出传递到存储过程的输入的 @StartDate 和 @EndDate 参数发生更改时:
2023-04-01
2023-04-30
到
01/01/2023
04/30/2023
在 SSRS 中运行时,从 SSMS 运行时保持不变。
所以我拥有的是一个父存储过程,在 SSMS 和 SSRS 中运行时会产生不同的输出,我可以在其中使用字符串手动对日期值进行硬编码,并使其在两者中工作。
更新:
此 SQL 适用于 SSRS 和 SSMS
DECLARE @TestFrom Date = CAST('2023-04-01' AS DATE)
DECLARE @TestTo Date = CAST('2023-04-30' AS DATE)
EXECUTE usp_MasterExtractV3
@StartDate = @TestFrom,
@EndDate = @TestTo
此 SQL 在 SSRS 中不起作用,但在 SSMS 中起作用
DECLARE @TestFrom Date = (SELECT CAST(Min(StartDate) AS DATE) AS StartDate FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear))
DECLARE @TestTo Date = (SELECT CAST(EndDate AS DATE) AS EndDate FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear) WHERE (Month = @localMonth))
EXECUTE usp_MasterExtractV3
@StartDate = @TestFrom,
@EndDate = @TestTo
语句返回的值:
(SELECT CAST(Min(StartDate) AS DATE) AS StartDate FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear))
是
2023-04-01
语句返回的值:
(SELECT CAST(EndDate AS DATE) AS EndDate FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear) WHERE (Month = @localMonth))
是
2023-04-30
这是我想到的一件事,可能会有所作为:
更改此代码:
(SELECT CAST(Min(StartDate) AS DATE) AS StartDate
FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear))
至此代码:
(SELECT Min(CAST(StartDate AS DATE)) AS StartDate
FROM [dbo].[udf_DateRangeDataWithOffsetStart] (@localYear,@localMonth,@StartOfYear))