从 SQL 存储过程返回工资单日期表

Posted

技术标签:

【中文标题】从 SQL 存储过程返回工资单日期表【英文标题】:Return a Table of Payroll Dates from a SQL Stored Procedure 【发布时间】:2010-10-25 17:34:23 【问题描述】:

我正在使用 SQL Server Reporting Services 2008,这对我来说有点新奇,因为我的大部分经验都是在 LAMP 开发方面。此外,将大部分逻辑作为存储过程移至 SQL 是我不太熟悉的事情,但我很想做。任何帮助或指导将不胜感激。

我需要一个表格形式的可接受工资单日期列表,以用作报告参数的允许值。理想情况下,此人将能够从报告参数提供的下拉列表中选择此工资单日期,然后将在数据集中使用该日期从表中提取数据。如果可能,我希望将逻辑存储在 SQL 服务器上,因为这很可能会用于其他一些报告。

创建日期列表的逻辑相当简单。它从系统需要的最早的工资单日期开始(2007 年的某个时间),然后每两周进行一次。该过程或函数应返回一个表,其中包含所有这些日期,包括最近的即将到来的工资单日期。

在我看来,解决这个问题的方法是创建一个临时表,向其中添加日期列表,然后返回该表以便报告参数可以读取它。这是一种可以接受的方式吗?

任何想法、示例或想法将不胜感激。

【问题讨论】:

【参考方案1】:

我会使用类似这样的 CTE:

;WITH PayPeriod AS (
    SELECT @DateIn2007 AS p UNION ALL
    SELECT DATEADD(dd, 14, p) as P FROM PayPeriod WHERE p < GetDate() )
SELECT p FROM PayPeriod
OPTION ( MAXRECURSION 500 )

MAXRECURSION 和/或 where 参数限制它将生成的日期数。

当然,您可以使用一个参数来计算出正确的限制,以获得正确的最后日期。

【讨论】:

【参考方案2】:

试试这样的:

;with AllDates AS
(
    SELECT CONVERT(datetime,'1/1/2007') AS DateOf
    UNION ALL
    SELECT DateOf+14
        FROM AllDates
    WHERE DateOf<GETDATE()+14
)
SELECT * FROM AllDates
OPTION (MAXRECURSION 500)

你可以把它放在视图或函数中。

但是,我建议不要显示这么多值的选择框,为什么不只使用两个文本框字段:开始日期结束日期和默认值他们到合理的价值,只是我的 2 美分

【讨论】:

谢谢!我最初的计划是使用开始日期和结束日期,但原来的系统让他们选择一个工资单日期,这就是他们想要坚持的。

以上是关于从 SQL 存储过程返回工资单日期表的主要内容,如果未能解决你的问题,请参考以下文章

如何从 T-SQL 存储过程返回表

sql 从函数或存储过程返回表

sql 调用已经建立的存储过程

如何将单个结果集从返回多个集的 SQL 存储过程保存到临时表?

从返回多个结果集的存储过程中插入临时表

将用户定义表中的日期值传递给 SQL Server 2008 存储过程