8

スカラー UDF のオプション "RETURNS NULL ON NULL INPUT" ( CREATE FUNCTIONを参照) は、パラメーターが null の場合、関数本体の実行を停止し、単に NULL を返します。

つまり、短絡します。

複数のパラメータを処理する方法を知っている人はいますか?

最初のパラメーターが少なくとも NULL の場合など、複数のパラメーターを使用して関数呼び出しを短絡すると便利です。

時間があれば、プロファイラーを使用して udf 呼び出しを追跡してみます。検索しましたが、何も見つかりません。おそらく、正しい検索用語を使用していない可能性があります。

それまでの間、誰かアイデアや経験をお持ちですか?

他の RDBMS ワールドからの回答も歓迎します。これは ANSI 設定であり、検索で DB2 と MySQL の結果が表示されました。

コメントに基づいて編集: 非 CLR 関数のみ

乾杯S

編集: プロファイラーを実行する必要はありません。どっ!これは動作を示しています。

CREATE FUNCTION dbo.ufnTest (
    @dummy tinyint
)
RETURNS tinyint
WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
    RETURN 1
END
GO
SELECT dbo.ufnTest(0), dbo.ufnTest(NULL)
GO


ALTER FUNCTION dbo.ufnTest (
    @dummy tinyint
)
RETURNS tinyint
--WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
    RETURN 1
END
GO
SELECT dbo.ufnTest(0), dbo.ufnTest(NULL)
GO


ALTER FUNCTION dbo.ufnTest (
    @dummy tinyint,
    @dummy2 tinyint
)
RETURNS tinyint
WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
    RETURN 1
END
GO
SELECT dbo.ufnTest(0, 2), dbo.ufnTest(NULL, 2), dbo.ufnTest(0, NULL)
GO


ALTER FUNCTION dbo.ufnTest (
    @dummy tinyint,
    @dummy2 tinyint
)
RETURNS tinyint
--WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
    RETURN 1
END
GO
SELECT dbo.ufnTest(0, 2), dbo.ufnTest(NULL, 2), dbo.ufnTest(0, NULL)
GO
4

2 に答える 2

10

はい、そのパラメータのいずれかが である場合、指定する関数RETURNS NULL ON NULL INPUTは短絡します。NULL

ドキュメントはこれを示唆していますが、不明確であり、CLR 関数のみを参照しているようです。NULL(これは、で指定された動作が CLR メソッドCREATE FUNCTIONの属性をオーバーライドすることを明確にするための Microsoft の試みだと思います。)OnNullCall

SQL2005 と SQL2008 の両方で非 CLR 関数を使用してこれをテストしたところ、期待どおりに短絡します。

于 2009-02-17T10:00:35.877 に答える
2

複数のパラメータを処理する方法を知っている人はいますか?

リンクの説明で十分ですか、それとも別のテイクを探していましたか?

RETURNS NULL ON NULL INPUTがCLR関数で指定されている場合、SQL Serverが受け取る引数のいずれかがNULLの場合、関数の本体を実際に呼び出さなくても、SQLServerがNULLを返すことができることを示します。

于 2009-02-16T15:06:44.217 に答える