T-SQL – 具有默认参数的函数

我有这个脚本:

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提供的参数数量不足。

为什么它不起作用?

你必须这样称呼它

 SELECT dbo.CheckIfSFExists( 23, default ) 

来自Technet :

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

您可以通过三种方式调用它 – 使用参数,使用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 

使用用户定义的函数,即使它们具有默认值,也必须声明每个参数。

以下将成功执行:

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

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

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

您不会将默认值传递给存储过程中设置的默认值。 你可以从你的输出variables中得到结果。