Я предполагаю, что это не является детерминированным просто потому, что DB_NAME()
не является детерминированным? Если DB_NAME()
не является детерминированным, почему он не является детерминированным?
ALTER FUNCTION [TheSchema].[udf_IS_PRODUCTION] ()
RETURNS bit
WITH SCHEMABINDING
AS
BEGIN
RETURN CASE WHEN DB_NAME() = 'PRODUCTION' THEN CONVERT(bit, 1) ELSE CONVERT(bit, 0) END
END
Обновление: Эта версия работает, является детерминированной, позволяет использовать один и тот же код в любой базе данных и удаляет жесткое кодирование имени базы данных (что также позволяет мне удалить другое автоматическое исключение состояния системы относительно базы данных кодировка имени)
ALTER FUNCTION [TheSchema].[udf_IS_PRODUCTION] ()
RETURNS bit
WITH SCHEMABINDING
AS
BEGIN
RETURN (SELECT IS_PRODUCTION FROM TheSchema.IS_PRODUCTION)
END
FYI Это фрагмент кода в моей системе самоотчета о состоянии системы, который я использую для мониторинга потенциальных проблем.
SELECT 'Non-deterministic Scalar UDF' AS Problem
,QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME) AS ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES WITH (NOLOCK)
WHERE IS_DETERMINISTIC = 'NO'
AND ROUTINE_TYPE = 'FUNCTION'
AND DATA_TYPE <> 'TABLE'
ORDER BY ROUTINE_SCHEMA
,ROUTINE_NAME