2008-10-31 2 views
4

Я попытался использовать OPTION (MAXRECURSION 0) для создания списка дат. Это кажется неподдерживаемым. Есть ли обходной путь для этой проблемы?Могу ли я использовать рекурсию в представлении Sql Server 2005?

EDIT, чтобы объяснить, что я на самом деле хочу сделать:

У меня есть 2 таблицы.

table1: INT будний день, BOOL доступны

table2: дата даты и времени, BOOL доступны

Я хочу, чтобы результат: view1: дата (здесь все дни в этом году), доступный (от table2 или таблица1, если нет в таблице 2).

Это означает, что я должен применить присоединение к дате в будний день. Я надеюсь, что это объяснение понятно, потому что я фактически использую больше таблиц с большим количеством полей в запросе.

Я нашел этот код для создания рекурсии:

WITH Dates AS 
(
    SELECT cast('2008-01-01' as datetime) Date 
    UNION ALL 
    SELECT Date + 1 
    FROM Dates 
    WHERE Date + 1 < DATEADD(yy, 1, GETDATE()) 
) 
+0

Я решил эту проблему, создав дополнительную таблицу в базе данных с указанием даты и DAYOFWEEK в виде столбцов. Я установил ошибку в миллионе в 2037 году для следующего разработчика в то время ... – Paco 2008-11-01 16:01:15

ответ

2

No - если вы можете найти способ сделать это в пределах 100 уровней ретуширования (иметь таблицу чисел), которая позволит вам достичь 100 уровней рекурсии, вы сможете это сделать. Но если у вас есть номера или сводной таблицы, вам не нужно будет рекурсии в любом случае ...

См this question (но я хотел бы создать таблицу, а не функцию табличное значение), this question и this link и this link

0

Вы можете использовать CTE для иерархических запросов.

+0

Это CTE, или я что-то упускаю? – Paco 2008-10-31 16:58:59

+0

Это CTE, но уровень рекурсии ограничен в представлении (или раньше, если рекурсия естественным образом заканчивается некоторыми критериями в CTE). – 2008-10-31 18:23:04

0

Здесь вы идете:

;WITH CTE_Stack(IsPartOfRecursion, Depth, MyDate) AS 
(
    SELECT 
     0 AS IsPartOfRecursion 
     ,0 AS Dept 
     ,DATEADD(DAY, -1, CAST('01.01.2012' as datetime)) AS MyDate 
    UNION ALL 

    SELECT 
     1 AS IsPartOfRecursion 
     ,Parent.Depth + 1 AS Depth 
     --,DATEADD(DAY, 1, Parent.MyDate) AS MyDate 
     ,DATEADD(DAY, 1, Parent.MyDate) AS MyDate 
    FROM 
    (
     SELECT 0 AS Nothing 
    ) AS TranquillizeSyntaxCheckBecauseWeDontHaveAtable 

    INNER JOIN CTE_Stack AS Parent 
     --ON Parent.Depth < 2005 
     ON DATEADD(DAY, 1, Parent.MyDate) < DATEADD(YEAR, 1, CAST('01.01.2012' as datetime)) 
) 

SELECT * FROM CTE_Stack 
WHERE IsPartOfRecursion = 1 
OPTION (MAXRECURSION 367) -- Accounting for leap-years 
; 
Смежные вопросы