максимальное количество вложенных транзакций и блок try-catch - PullRequest
0 голосов
/ 17 мая 2019

сколько вложенных транзакций и вложенных попыток sql может иметь за один сеанс.

1 Ответ

0 голосов
/ 17 мая 2019

Появляется 375. Ниже работает:

DECLARE @SQL nvarchar(MAX);

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP 375 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 I
    FROM N N1, N N2, N N3)
SELECT @SQL = STUFF((SELECT NCHAR(13) + NCHAR(10) + REPLICATE('    ',T.I) + CONVERT(nvarchar(MAX),N'BEGIN TRY') + NCHAR(13) + NCHAR(10) + REPLICATE('    ',T.I+1 )+  N'SELECT 1;'
                     FROM Tally T
                     ORDER BY T.I
                     FOR XML PATH(''),TYPE).value('.','nvarchar(MAX)'),1,2,N'') + NCHAR(13) + NCHAR(10) +
              STUFF((SELECT NCHAR(13) + NCHAR(10) +REPLICATE('    ',T.I) + N'END TRY' + NCHAR(13) + NCHAR(10) + REPLICATE('    ',T.I) + CONVERT(nvarchar(MAX),N'BEGIN CATCH')+ NCHAR(13) + NCHAR(10) +  + REPLICATE('    ',T.I+1) + N'SELECT 2;' + NCHAR(13) + NCHAR(10) +  + REPLICATE('    ',T.I) + N'END CATCH' 
                     FROM Tally T
                     ORDER BY T.I DESC
                     FOR XML PATH(''),TYPE).value('.','nvarchar(MAX)'),1,2,N'')

--PRINT @SQL;
EXEC sp_executesql @SQL;

Если, однако, вы измените его на TOP 376, вы получите ошибку:

Msg 191, уровень 15Состояние 1, строка 755Некоторая часть вашего оператора SQL вложена слишком глубоко.Перепишите запрос или разбейте его на более мелкие запросы.

...