172

私はこのスクリプトを持っています:

CREATE FUNCTION dbo.CheckIfSFExists(@param1 INT, @param2 BIT = 1 )
RETURNS BIT
AS
BEGIN
    IF EXISTS ( bla bla bla )
        RETURN 1;
    RETURN 0;
END
GO

このように手順で使用したい:

IF dbo.CheckIfSFExists( 23 ) = 0
    SET @retValue = 'bla bla bla';

しかし、エラーが発生します:

プロシージャまたは関数dbo.CheckIfSFExistsに指定された引数の数が不十分です。

なぜ機能しないのですか?

4

4 に答える 4

252

あなたはそれをこのように呼ばなければなりません

SELECT dbo.CheckIfSFExists(23, default)

Technetから:

関数のパラメーターにデフォルト値がある場合、デフォルト値を取得するには、関数を呼び出すときにキーワードDEFAULTを指定する必要があります。この動作は、パラメーターを省略するとデフォルト値も意味するストアドプロシージャでデフォルト値のパラメーターを使用する場合とは異なります。この動作の例外は、EXECUTEステートメントを使用してスカラー関数を呼び出す場合です。EXECUTEを使用する場合、DEFAULTキーワードは必要ありません。

于 2011-12-02T15:11:49.553 に答える
42

これは、パラメーター、DEFAULT、EXECUTEの3つの方法で呼び出すことができます。

SET NOCOUNT ON;

DECLARE
@Table  SYSNAME = 'YourTable',
@Schema SYSNAME = 'dbo',
@Rows   INT;

SELECT dbo.TableRowCount( @Table, @Schema )

SELECT dbo.TableRowCount( @Table, DEFAULT )

EXECUTE @Rows = dbo.TableRowCount @Table

SELECT @Rows
于 2013-09-19T12:33:09.400 に答える
18

ユーザー定義関数では、デフォルト値がある場合でも、すべてのパラメーターを宣言する必要があります。

以下は正常に実行されます。

IF dbo.CheckIfSFExists( 23, default ) = 0
    SET @retValue = 'bla bla bla;
于 2011-12-02T15:11:25.793 に答える
-3

この問題を回避する1つの方法は、出力パラメーターを指定してストアード・プロシージャーを使用することです。

exec sp_mysprocname @returnvalue output、@firstparam = 1、@ secondparam = 2

デフォルトで渡さない値は、ストアドプロシージャ自体で設定されたデフォルトになります。そして、出力変数から結果を得ることができます。

于 2017-01-26T18:10:47.190 に答える