web-dev-qa-db-fra.com

T-SQL - fonction avec les paramètres par défaut

J'ai ce script:

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

Je veux l'utiliser dans une procédure de cette façon:

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

Mais je reçois l'erreur:

Un nombre insuffisant d'arguments ont été fournis pour la procédure ou la fonction dbo.CheckIfSFExists.

Pourquoi ça ne marche pas?

140
nirmus

vous devez l'appeler comme ça

SELECT dbo.CheckIfSFExists(23, default)

De Technet :

Lorsqu'un paramètre de la fonction a une valeur par défaut, le mot-clé DEFAULT doit être spécifié lors de l'appel de la fonction afin de récupérer la valeur par défaut. Ce comportement diffère de l'utilisation de paramètres avec des valeurs par défaut dans les procédures stockées dans lesquelles l'omission du paramètre implique également la valeur par défaut. Une exception à ce comportement se produit lors de l'appel d'une fonction scalaire à l'aide de l'instruction EXECUTE. Lors de l'utilisation de EXECUTE, le mot clé DEFAULT n'est pas requis.

213
SQLMenace

Vous pouvez l’appeler de trois manières: avec des paramètres, avec DEFAULT et via 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
36
Douglas Osborne

Avec les fonctions définies par l'utilisateur, vous devez déclarer chaque paramètre, même s'il a une valeur par défaut.

Les éléments suivants s'exécuteraient avec succès:

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