Я новичок в хранимых процедурах и пытаюсь создать один для школьного проекта. Я написал инструкцию SQL, которая делает то, что я хочу, и просто преобразовал ее в хранимую процедуру (возможно, это плохая хакерская работа, но у нас заканчивается время и у нас есть куча других дел). Мы используем aspnet Membership Services и всю встроенную базу данных.
Что я хочу сделать
Я использую 1 таблицу (TimesheetEntry). Я хочу получить все табели всех сотрудников, суммировать часы в будний день, чтобы получить часы / неделю, и повторить это за последние 4 недели (неделя 1 неделя 4 ниже) и за последние 4 месяца (месяц 1 месяц 4) ниже. Для этого я использовал вложенные операторы select.
Вот полное сообщение об ошибке:
Ошибка 217: превышен максимальный уровень вложенности хранимой процедуры, функции, триггера или представления (предел 32).
Вот полная хранимая процедура:
CREATE PROCEDURE sp_GetTimesheetSummaryReport2
@dateFor DATETIME
AS
SELECT CONVERT(VARCHAR, DATEADD(DAY, -7, GETDATE()), 111) AS startDate,
CONVERT(VARCHAR, GETDATE(), 111) AS currentDate,
projId, wpId, empId,
(
SELECT (SUM(mon) + Sum(tue) + Sum(wed) + Sum(thu) + SUM(fri) + SUM(sat) + SUM(sun)) AS Week
FROM TimesheetEntry
WHERE empId = t.empId AND tsDate BETWEEN @dateFor AND DATEADD(DAY, -7, @dateFor)
GROUP BY empId, projId, wpId
) AS week1,
(
SELECT (SUM(mon) + Sum(tue) + Sum(wed) + Sum(thu) + SUM(fri) + SUM(sat) + SUM(sun)) AS Week
FROM TimesheetEntry
WHERE empId = t.empId AND tsDate BETWEEN DATEADD(DAY, -7, @dateFor) AND DATEADD(DAY, -14, @dateFor)
GROUP BY empId, projId, wpId
) AS week2,
(
SELECT (SUM(mon) + Sum(tue) + Sum(wed) + Sum(thu) + SUM(fri) + SUM(sat) + SUM(sun)) AS Week
FROM TimesheetEntry
WHERE empId = t.empId AND tsDate BETWEEN DATEADD(DAY, -14, @dateFor) AND DATEADD(DAY, -21, @dateFor)
GROUP BY empId, projId, wpId
) AS week3,
(
SELECT (SUM(mon) + Sum(tue) + Sum(wed) + Sum(thu) + SUM(fri) + SUM(sat) + SUM(sun)) AS Week
FROM TimesheetEntry
WHERE empId = t.empId AND tsDate BETWEEN DATEADD(DAY, -21, @dateFor) AND DATEADD(DAY, -28, @dateFor)
GROUP BY empId, projId, wpId
) AS week4,
(
SELECT (SUM(mon) + Sum(tue) + Sum(wed) + Sum(thu) + SUM(fri) + SUM(sat) + SUM(sun)) AS Month
FROM TimesheetEntry
WHERE empId = t.empId AND MONTH(tsDate) = MONTH(@dateFor)
GROUP BY empId, projId, wpId
) AS month1,
(
SELECT (SUM(mon) + Sum(tue) + Sum(wed) + Sum(thu) + SUM(fri) + SUM(sat) + SUM(sun)) AS Month
FROM TimesheetEntry
WHERE empId = t.empId AND MONTH(tsDate) = MONTH(DATEADD(MONTH, -1, @dateFor))
GROUP BY empId, projId, wpId
) AS month2,
(
SELECT (SUM(mon) + Sum(tue) + Sum(wed) + Sum(thu) + SUM(fri) + SUM(sat) + SUM(sun)) AS Month
FROM TimesheetEntry
WHERE empId = t.empId AND MONTH(tsDate) = MONTH(DATEADD(MONTH, -2, @dateFor))
GROUP BY empId, projId, wpId
) AS month3,
(
SELECT (SUM(mon) + Sum(tue) + Sum(wed) + Sum(thu) + SUM(fri) + SUM(sat) + SUM(sun)) AS Month
FROM TimesheetEntry
WHERE empId = t.empId AND MONTH(tsDate) = MONTH(DATEADD(MONTH, -3, @dateFor))
GROUP BY empId, projId, wpId
) AS month4
FROM TimesheetEntry t
GROUP BY t.empId, t.projId, t.wpId
ORDER BY t.projId, t.wpId, t.empId;
EXECUTE sp_GetTimesheetSummaryReport '2011/02/01';
Мои вопросы
Почему я получаю эту ошибку? Есть я
превысил стек, там тоже
многие хранятся
процедуры / триггеры / функции в
база данных, мое вложение слишком глубокое?
Как я могу решить это? Мой хранится
процедура настолько ужасна, что я должен
перезапустить, используя лучший синтаксис?