Я столкнулся с интересным поведением при использовании определяемых пользователем функций в операторе SELECT.
У меня есть пара хранимых процедур, которые считывают и удаляют данные из одной таблицы. Эти хранимые процедуры используются несколькими источниками.
По моим наблюдениям, определяемые пользователем функции иногда оцениваются произвольно, не всегда сразу после или во время выполнения оператора SELECT, в котором он используется.
Например, в хранимой процедуре я оператор select может выглядеть примерно так:
SELECT Something, MyFunction(Something) FROM Somewhere;
За ним следует вызов другой хранимой процедуры, которая удаляет данные из таблицы. Объем очищаемых данных регулируется другой таблицей, в которой хранится максимальный прочитанный идентификатор. Это делается для того, чтобы при очистке не удалялись данные, которые еще не были прочитаны другим экземпляром выполняемой хранимой процедуры.
В моем тестовом коде MyFunction просто возвращает количество строк в таблице Somewhere. Таким образом, я бы предположил, что оно всегда должно быть равно количеству строк, возвращаемых оператором SELECT.Однако в тех случаях, когда я запускаю два экземпляра этой хранимой процедуры, я получаю примерно такие результаты:
Первый экземпляр запроса:
Something MyFunction(Something)
--------- ---------------------
A 3
B 3
C 3
Второй экземпляр запроса:
Something MyFunction(Something)
--------- ---------------------
A 0
B 0
C 0
Почему второй запрос возвращает все строки, но определяемая пользователем функция, которая работает с той же таблицей, сообщает, что в таблице больше нет строк?
Могу ли я как-то гарантировать, что второй экземпляр запроса согласован в том смысле, что определяемые пользователем функции по-прежнему видят те же данные, что и родительская хранимая процедура?