決定論的ではないという理由だけで、これは決定論的で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
参考までに、これは、潜在的な問題を監視するために使用するシステムの状態の自己報告システムのコード スニペットです。
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