4

決定論的ではないという理由だけで、これは決定論的で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
4

4 に答える 4

5

確かに、私はそれを決定論的にする1つの方法を考えることができます。この関数を本番データベースにデプロイします。

ALTER FUNCTION [TheSchema].[udf_IS_PRODUCTION] ()
RETURNS bit
    WITH SCHEMABINDING
AS 
BEGIN
    RETURN CONVERT(bit, 1)
END

そして、これをテストデータベースにデプロイします。

ALTER FUNCTION [TheSchema].[udf_IS_PRODUCTION] ()
RETURNS bit
    WITH SCHEMABINDING
AS 
BEGIN
    RETURN CONVERT(bit, 0)
END

これはばかげているように見えるかもしれませんが、IMOのデータベース名は、一部のUDFの戻り値よりも「ハードコーディング」されるべきではありません。

さらに良いことに、この情報を構成テーブルのどこかに置くだけです。

于 2010-01-22T16:40:04.237 に答える
2

DB_NAME() を内部的に決定するのではなく、パラメーターとして送信するように関数を書き直すことはできませんか??

ALTER FUNCTION [TheSchema].[udf_IS_PRODUCTION] (DatabaseName VARCHAR(255))
RETURNS bit
WITH SCHEMABINDING
AS 
    BEGIN
        RETURN CASE WHEN DatabaseName = 'PRODUCTION' 
                    THEN CONVERT(bit, 1) 
                    ELSE CONVERT(bit, 0) 
               END
    END

決定論的であるべきではありませんよね?

DB_NAME()呼び出すと、データベース名を決定する関数として使用できます

于 2010-01-22T16:45:27.093 に答える
1

決定論的関数は、定義上、戻り値がその引数の値によって一意に識別される関数です。

さて、引数DB_NAME()(どれもありません) が与えられたとき、何を返すか分かりますか?

于 2010-01-22T16:34:14.987 に答える
1

決定論の厳密な意味では、結果は入力パラメータに基づくのではなく、制御できない外部オブジェクトの状態に基づきます。

名義変更等可能です。

Alter Database Modify Name = new_name

2005年、デフォルトのスキーマに対して試してみたところ、SQLは関数の作成を妨げませんでした。非決定論に基づいて関数を受け入れることを拒否する状況に陥り、それを回避する必要がある場合 (リスクなど)、その回避策は、関数を使用するビューを作成し、次にから選択することです。関数内のビュー。

于 2010-01-22T16:36:24.720 に答える