は現在、我々はそれのテーブルからデータを返すストアドプロシージャは、このような何かを実行して、元のスキーマだていますので、どんなにテーブルのスキーマの変更CTEの再帰の深さを制限する方法はありますが、汎用テーブルを選択するにはどうすればよいですか?
WITH CTE AS
(
-- Start CTE off by selecting the id that was provided to stored procedure.
SELECT *
FROM [dbo].[TestTable]
WHERE [Id] = 1
-- Recursively add tasks that are children of records already found in previous iterations.
UNION ALL
SELECT t.*
FROM [dbo].[TestTable] as t
INNER JOIN CTE as tcte
ON t.[ParentId] = tcte.[Id]
)
SELECT *
FROM CTE
これは限り[があるので、いいですId]と[ParentId]列を使用しているため、このストアドプロシージャを更新する必要はありません。私は同様のことをしたいと思いますが、再帰の深度を動的に指定することもできます。私はこれを行うに見てきた唯一の方法はそうのようなレベル/深さの識別子を追加することです:
WITH CTE AS
(
-- Start CTE off by selecting the task that was provided to stored procedure.
SELECT *, 0 as [Level]
FROM [dbo].[TestTable]
WHERE [Id] = 1
-- Recursively add tasks that are children of parent tasks that have already been found in previous iterations.
UNION ALL
SELECT t.*, [Level] + 1
FROM [dbo].[TestTable] as t
INNER JOIN CTE as tcte
ON t.[ParentId] = tcte.[Id]
WHERE [Level] < 2
)
SELECT *
FROM CTE
これはうまく動作しますが、*
を選択するので、最後に前のクエリの主要なプラスを奪うが得られます私もレベル。私はレベルを指定することができますが、一般的にテーブルからすべての列を選択することができるこの他の方法がありますか?前もって感謝します。
制限値に達するとエラーが表示されるようです。 MAXRECURSIONに基づいて停止する方法はありますか? – Ocelot20
上記(別の提案と共に)... – mwigdahl