Могу ли я использовать рекурсию в Sql Server 2005 View? - PullRequest
4 голосов
/ 31 октября 2008

Я пытался использовать OPTION (MAXRECURSION 0) в представлении для создания списка дат. Кажется, это не поддерживается. Есть ли решение этой проблемы?

РЕДАКТИРОВАТЬ, чтобы объяснить, что я на самом деле хочу сделать:

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

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

table2: дата-время, bool доступно

Я хочу получить результат: view1: дата (здесь все дни в этом году), доступно (из таблицы2 или из таблицы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())
)

Ответы [ 3 ]

2 голосов
/ 31 октября 2008

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

См. этот вопрос (но я бы создал таблицу, а не табличную функцию), этот вопрос и эта ссылка и эта ссылка

0 голосов
/ 16 ноября 2012

Вот, пожалуйста:

;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
;
0 голосов
/ 31 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...