我认为这不是确定性的,因为DB_NAME()
不是确定性的吗?如果DB_NAME()
不确定,为什么它不是确定性的?有什么办法可以使这个UDF具有确定性吗?
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
因为更改数据库中不锁定所有的数据吗?基本上有人可以在长时间运行的查询期间重命名数据库。 – 2010-01-22 16:30:35