Значение столбца таблицы, получаемое пользовательской функцией, обрезается
Есть функция
CREATE FUNCTION verbose_month(@value int)
RETURNS VARCHAR(15)
AS
BEGIN
IF @value = 1 RETURN 'Январь'
IF @value = 2 RETURN 'Февраль'
IF @value = 3 RETURN 'Март'
IF @value = 4 RETURN 'Апрель'
IF @value = 5 RETURN 'Май'
IF @value = 6 RETURN 'Июнь'
IF @value = 7 RETURN 'Июль'
IF @value = 8 RETURN 'Август'
IF @value = 9 RETURN 'Сентябрь'
IF @value = 10 RETURN 'Октябрь'
IF @value = 11 RETURN 'Ноябрь'
IF @value = 12 RETURN 'Декабрь'
RETURN ''
END
и запрос
SELECT E.name, E.type_of_building, DBO.verbose_month(R.month) AS 'Месяц', RR.volume / Res.coefficient AS 'T.y.T'
FROM Education AS E
JOIN Report AS R
ON R.reporting = E.ID
JOIN ResourceReport AS RR
ON RR.report = R.ID
JOIN Resource AS Res
ON RR.resource = Res.ID AND Res.name = 'Электричество'
все значения получаемые из функции обрезаются

но при единичном запросе все нормально
PRINT DBO.verbose_month(1)
-- Январь
Схема данных наверное не обязательна
Ответы (1 шт):
В MS SQL 2019 была добавлена возможность инлайна для скалярных пользовательских функций.
Scalar UDF Inlining - зачем, как и почему.
Но, к сожалению, новый функционал богат на неприятные "нюансы".
По ссылке выше в том числе описаны способы отключить Scalar UDF Inlining:
Для всей БД, команда:
ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = OFF;
Для конкретного запроса, хинт:
OPTION (USE HINT('DISABLE_TSQL_SCALAR_UDF_INLINING'));
Дополнительно рекомендую поддерживать актуальность версии сервера, так как каждый очередной CU содержит широкий набор исправлений.
SQL Server build version 15.0.2070.41 вышел 04.11.2019.
Актуальный 15.0.4033.1 - 31.03.2020
Возможно, без заморочек с включением/выключением Scalar UDF Inlining поможет явная конвертация результата функции к ожидаемому типу:
CREATE FUNCTION verbose_month(@value int)
RETURNS VARCHAR(15)
AS
BEGIN
IF @value = 1 RETURN CONVERT( VARCHAR(15), 'Январь' )
IF @value = 2 RETURN CONVERT( VARCHAR(15), 'Февраль' )
IF @value = 3 RETURN CONVERT( VARCHAR(15), 'Март' )
IF @value = 4 RETURN CONVERT( VARCHAR(15), 'Апрель' )
IF @value = 5 RETURN CONVERT( VARCHAR(15), 'Май' )
IF @value = 6 RETURN CONVERT( VARCHAR(15), 'Июнь' )
IF @value = 7 RETURN CONVERT( VARCHAR(15), 'Июль' )
IF @value = 8 RETURN CONVERT( VARCHAR(15), 'Август' )
IF @value = 9 RETURN CONVERT( VARCHAR(15), 'Сентябрь' )
IF @value = 10 RETURN CONVERT( VARCHAR(15), 'Октябрь' )
IF @value = 11 RETURN CONVERT( VARCHAR(15), 'Ноябрь' )
IF @value = 12 RETURN CONVERT( VARCHAR(15), 'Декабрь' )
RETURN CONVERT( VARCHAR(15), '' )
END