Je suppose que ce n'est pas déterministe simplement parce que DB_NAME()
n'est pas déterministe? Si DB_NAME()
n'est pas déterministe, pourquoi n'est-elle pas déterministe?Y a-t-il un moyen de rendre cette fonction UDF déterministe?
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
Mise à jour: Cette version fonctionne, est déterministe, permet le même code à utiliser dans une base de données et supprime le hardcoding du nom de base de données (ce qui me permet également de supprimer une autre exception de la santé du système automatique dans la base de données le nom de codage)
ALTER FUNCTION [TheSchema].[udf_IS_PRODUCTION]()
RETURNS bit
WITH SCHEMABINDING
AS
BEGIN
RETURN (SELECT IS_PRODUCTION FROM TheSchema.IS_PRODUCTION)
END
pour votre information C'est l'extrait de code dans mon système système d'autodéclaration santé que j'utilise pour surveiller les éventuels problèmes.
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
Parce que renommer la base de données ne se bloque pas toutes les données qu'il contient? Fondamentalement, quelqu'un serait en mesure de renommer la base de données au cours d'une longue requête. –