Возврат таблицы дат заработной платы из хранимой процедуры SQL - PullRequest
1 голос
/ 25 октября 2010

Я работаю с SQL Server Reporting Services 2008, что для меня несколько ново, так как большая часть моего опыта связана с разработкой LAMP. Кроме того, я не очень хорошо знаком с переносом большей части логики в SQL как хранимые процедуры, но хотел бы это сделать. Любая помощь или направление будет принята с благодарностью.

Мне нужен список допустимых дат платежной ведомости в форме таблицы, чтобы использовать в качестве допустимых значений для параметра отчета. В идеале человек сможет выбрать эту дату расчета из раскрывающегося списка, предоставленного параметром отчета, который затем будет использоваться в наборе данных для извлечения данных из таблицы. Я хотел бы, чтобы логика была сохранена на сервере SQL, если это возможно, поскольку это то, что, скорее всего, будет использоваться в нескольких других отчетах.

Логика создания списка дат довольно проста. Он начинается с самой старой даты платежной ведомости, которая необходима системе (где-то в 2007 году), и просто начинается каждые две недели. Процедура или функция должны возвращать таблицу, которая содержит все эти даты вплоть до ближайшей предстоящей даты расчета.

Мне кажется, что для этого можно воспользоваться процедурой или функцией, которая создает временную таблицу, добавляет к ней список дат, а затем возвращает эту таблицу, чтобы параметр отчета мог ее прочитать. Это приемлемый способ?

Любые идеи, примеры или мысли будут с благодарностью.

Ответы [ 2 ]

2 голосов
/ 25 октября 2010

Я бы использовал 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 и / или где ограничивает количество дат, которые он генерирует.

Вы можете использовать параметр для определения правильного предела, чтобы получить правильную последнюю дату, конечно же.

1 голос
/ 25 октября 2010

попробуйте что-то вроде этого:

;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 цента

...