Common Table Expression: Maxrecursion
September 22nd, 2012DBA, Denali, Developer, SQL Server 2008, SQL Server 2012, T-SQL No CommentsSQL Server tarjoaa mahdollisuuden kirjoittaa rekursiivisia kyselyitä Common Table Expression-rakenteen avulla. Sinäsä CTE ei ole mitenkään SQL Server-spesifinen – sama rakenne on periaatteessa käytettävissä myös mm. Oraclen tietokannassa. Rekursioiden määrä on defaultista rajoitettu SQL Serverin CTE:ssa sataan:
--menee läpi DECLARE @LOOP INT = 100 ;WITH cte_numero AS ( SELECT 0 AS n UNION ALL SELECT n + 1 FROM cte_numero WHERE n < @LOOP ) SELECT n as numero FROM cte_numero GO --tuottaa virheen DECLARE @LOOP INT = 101 ;WITH cte_numero AS ( SELECT 0 AS n UNION ALL SELECT n + 1 FROM cte_numero WHERE n < @LOOP ) SELECT n as numero FROM cte_numero GO
Rekursioiden määrää voi lisätä lisäämäällä CTE:n loppuun OPTION(MAXRECURSION):
DECLARE @LOOP INT = 101 ;WITH cte_numero AS ( SELECT 0 AS n UNION ALL SELECT n + 1 FROM cte_numero WHERE n < @LOOP ) SELECT n as numero FROM cte_numero OPTION(MAXRECURSION 1000) GO
Jos kyselyn loppuun laittaa määreen OPTION (MAXRECURSION 0), ei rekursion määrää ole rajoitettu, mutta se voi johtaa infinite luuppiin. Huomaa siis Microsoftin sivulta huomio:
An incorrectly composed recursive CTE may cause an infinite loop. For example, if the recursive member query definition returns the same values for both the parent and child columns, an infinite loop is created. To prevent an infinite loop, you can limit the number of recursion levels allowed for a particular statement by using the MAXRECURSION hint and a value between 0 and 32,767 in the OPTION clause of the INSERT, UPDATE, MERGE, DELETE, or SELECT statement. This lets you control the execution of the statement until you resolve the code problem that is creating the loop. The server-wide default is 100. When 0 is specified, no limit is applied. Only one MAXRECURSION value can be specified per statement. For more information, see Query Hints (Transact-SQL).
Kommentit