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)

来自技术网

当函数的参数有默认值时,调用函数时必须指定关键字DEFAULT,以便检索默认值。此行为与在存储过程中使用具有默认值的参数不同,其中省略参数也意味着默认值。此行为的一个例外是使用 EXECUTE 语句调用标量函数时。使用 EXECUTE 时,不需要 DEFAULT 关键字。

于 2011-12-02T15:11:49.553 回答
42

您可以通过三种方式调用它 - 使用参数、使用 DEFAULT 和通过 EXECUTE

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

解决此问题的一种方法是使用带有输出参数的存储过程。

exec sp_mysprocname @returnvalue 输出,@firstparam = 1,@secondparam=2

您不传递的值默认为存储过程本身中设置的默认值。你可以从你的输出变量中得到结果。

于 2017-01-26T18:10:47.190 回答