【发布时间】:2010-01-22 16:26:23
【问题描述】:
我认为这不是确定性的,仅仅是因为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
仅供参考这是我的系统健康自我报告系统中的代码 sn-p,我用它来监控潜在问题。
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
【问题讨论】:
-
因为重命名数据库不会锁定里面的所有数据?基本上有人可以在长时间运行的查询期间重命名数据库。
标签: sql-server user-defined-functions deterministic