2008-10-31 11 views
4

J'ai essayé d'utiliser OPTION (MAXRECURSION 0) en vue de générer une liste de dates. Cela semble être non pris en charge. Y a-t-il une solution de contournement pour ce problème?Puis-je utiliser la récursivité dans une vue Sql Server 2005?

EDIT pour expliquer ce que je veux vraiment faire:

J'ai 2 tables.

Tableau 1: semaine int, bool disponible

table2: Date datetime, bool disponible

Je veux le résultat: view1: Date (ici tous les jours de cette année), disponible (de table2 ou de table1 lorsqu'elle n'est pas dans la table2).

Cela signifie que je dois appliquer une jointure à une date avec un jour de la semaine. J'espère que cette explication est compréhensible, parce que je l'utilise en fait plus des tables avec plus de champs dans la requête.

J'ai trouvé ce code pour générer la récursion:

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

J'ai résolu le problème en créant une table supplémentaire dans la base de données avec la date et l'dayofweek sous forme de colonnes. J'ai mis le bug à 2037 millenium pour le prochain développeur à ce moment-là ... Ce – Paco

Répondre

2

No - Si vous pouvez trouver un moyen de le faire dans 100 niveaux de recusion (avoir un tableau de nombres), ce qui vous permettra d'atteindre 100 niveaux de récursivité, vous serez capable de le faire. Mais si vous avez un nombre ou un tableau croisé dynamique, vous aurez pas besoin du récursivité ...

Voir this question (mais je voudrais créer une table et non une fonction à valeur de table), this question et this link et this link

0

Vous pouvez utiliser un CTE pour les requêtes hiérarchiques.

+0

est CTE ou suis-je manque quelque chose? – Paco

+0

Ceci est un CTE, mais le niveau de récursivité est limité à 100 dans une vue (ou plus tôt, si la récursivité se termine naturellement avec certains critères dans le CTE). –

0

ici, vous allez:

;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

Ce n'est pas valide dans une vue qui est le point de la question. L'indice doit aller dans le select de la vue. –