Запуск SQL 2005 X64.
Сначала создайте следующий сохраненный процесс в базе данных:
CREATE PROCEDURE dbo.Test
@Value int = null
AS
BEGIN
IF (IsNull(@Value, '') = '')
SELECT '*I am NULL!*'
ELSE
SELECT 'I am ' + CONVERT(varchar(20), @Value)
END
Попробуйте выполнить вышеупомянутый процесс следующим образом, и вы получите следующий результат:
EXEC dbo.Test
Я NULL!
Теперь измените процедуру так, чтобы инструкция EXEC была частью самого sproc:
ALTER PROCEDURE dbo.Test
@Value int = null
AS
BEGIN
IF (IsNull(@Value, '') = '')
SELECT 'I am NULL!'
ELSE
SELECT 'I am ' + CONVERT(varchar(20), @Value)
END
EXEC dbo.Test
Если вы выполните ее сейчас, вы получите...
Я NULL!
Я NULL!
Я NULL!
... до бесконечности до тех пор, пока выход не прервется с этой ошибкой:
Сообщение 217, уровень 16, состояние 1, проверка процедуры, строка 16, максимумпревышен уровень вложенности хранимой процедуры, функции, триггера или представления (предел 32).
На данный момент игнорируем, что это совсем не стандартная практика и что, скорее всего, кто-то сделает что-то подобноеМожет ли кто-то случайно сообщить о том, что «думает» SQL 2005, когда исполняется второе воплощение этого процесса?