0

ストップライト ステータス

1  - Red
2  - Yellow
3  - Green

これは決定論的な関数なので...

CREATE FUNCTION dbo.udf_StoplightStatusRed()
RETURNS TINYINT
WITH SCHEMABINDING
AS
    RETURN CAST(1 as TINYINT)
END

やっても安全でしょうか...

SELECT
    [Status] = CASE StoplightStatusID WHEN dbo.udf_StoplightStatusRed() THEN 1 ELSE 0 END
FROM dbo.StoplightAudit
WHERE StopLightStatusID = dbo.udf_StoplightStatusRed()

クエリ自体はあまり意味がありません。これを行うと、関数が各行に対して評価されないことを確認したいだけです。

詳細情報を取得するには、他の多くのテーブルに参加する必要があります。最初に CTE のすべての監査 ID を取得してそれに参加する方がよいでしょうか、それともこれらの関数は決定論的であるため問題ではありませんか?

4

1 に答える 1

1

関数は決定論的である必要があります。

決定論的関数は、特定の一連の入力値を指定して呼び出され、データベースの状態が同じである場合、常に同じ結果を返します。非決定論的関数は、アクセスするデータベースの状態が同じであっても、特定の入力値のセットで呼び出されるたびに異なる結果を返す場合があります。

データベース エンジンは、Transact-SQL 関数の本体を自動的に分析し、関数が決定論的であるかどうかを評価します。たとえば、関数が非決定的である他の関数を呼び出す場合、または関数が拡張ストアド プロシージャを呼び出す場合、データベース エンジンは関数を非決定的としてマークします。共通言語ランタイム (CLR) 関数の場合、データベース エンジンは関数の作成者に依存して、関数を決定論的または SqlFunction カスタム属性を使用していないとマークします。

于 2013-06-21T14:53:15.680 に答える