Attualmente abbiamo una stored procedure che restituisce i dati da una tabella in esso è lo schema originale di fare qualcosa di simile:Come limitare la profondità della ricorsione CTE ma selezionare la tabella generica?
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
Questo è bello, perché non importa quanto le modifiche dello schema tavolo, finché ci sono [ Id] e [ParentId] colonne, non dovrò aggiornare questa stored procedure. Mi piacerebbe fare qualcosa di simile, ma anche essere in grado di specificare la profondità della ricorsione in modo dinamico. L'unico modo che ho visto per farlo è quello di aggiungere un livello/identificatore di profondità in questo modo:
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
Questo funziona bene, ma toglie il grande vantaggio della query precedente in quanto la selezione *
alla fine darà anche io il livello. C'è un altro modo per farlo quando posso specificare un livello, ma anche selezionare genericamente tutte le colonne dalla tabella? Grazie in anticipo.
Sembra generare un errore quando viene raggiunto il limite. C'è un modo per fermarlo basato su MAXRECURSION, ma continuare a usare i risultati? – Ocelot20
Risposte sopra (con un altro suggerimento) ... – mwigdahl