4

OPTION (MAXRECURSION 0)ビューで使用して日付のリストを生成しようとしました。これはサポートされていないようです。この問題の回避策はありますか?

私が実際にやりたいことを説明する編集:

私は2つのテーブルを持っています。

table1: int 平日、bool 利用可能

table2: datetime 日付、bool 利用可能

私は結果が欲しい:ビュー1:日付(ここでは今年のすべての日)、利用可能(テーブル2から、またはテーブル2にない場合はテーブル1から)。

つまり、平日の日付に結合を適用する必要があります。この説明が理解できることを願っています。実際には、クエリでより多くのフィールドを持つより多くのテーブルを使用しているためです。

再帰を生成する次のコードを見つけました。

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())
)
4

3 に答える 3

2

いいえ- 100 レベルの再帰レベル内でそれを行う方法を見つけることができれば (数値表を用意してください)、100 レベルの再帰レベル内に到達できれば、それを実行できます。ただし、数値またはピボット テーブルがある場合は、とにかく再帰は必要ありません...

この質問を参照してください(ただし、テーブル値関数ではなくテーブルを作成します)、この質問このリンク、およびこのリンク

于 2008-10-31T18:17:16.047 に答える
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
;
于 2012-11-16T13:24:51.267 に答える
0

階層クエリにCTEを使用できます。

于 2008-10-31T16:46:38.650 に答える