T - SQL-fonction avec 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 j'obtiens l'erreur:

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

pourquoi ça ne marche pas?

122
demandé sur Peter Elzinga 2011-12-02 19:06:42

4 réponses

vous devez l'appeler comme ça

SELECT dbo.CheckIfSFExists(23, default)

À Partir De Technet :

quand un paramètre de la fonction a une valeur par défaut, le mot-clé La valeur par défaut doit être spécifiée lorsque la fonction est appelée pour récupérer la valeur par défaut. Ce comportement est différent de l'utilisation paramètres avec valeurs par défaut dans les procédures stockées dans lequel omettre le paramètre implique également la valeur par défaut. Un exception à cette règle comportement lors de l'appel d'une fonction scalaire à l'aide de l'EXÉCUTER déclaration. Lors de L'utilisation D'EXECUTE, le mot clé par défaut n'est pas requis.

185
répondu SQLMenace 2018-07-25 13:46:29

vous pouvez l'appeler de trois façons - avec des paramètres, par défaut et via L'exécution

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
30
répondu Douglas Osborne 2013-09-19 12:55:50

avec des fonctions définies par l'utilisateur, vous devez déclarer chaque paramètre, même s'ils ont une valeur par défaut.

le suivant s'exécuterait avec succès:

IF dbo.CheckIfSFExists( 23, default ) = 0
    SET @retValue = 'bla bla bla;
15
répondu Curt 2011-12-02 15:11:25

Une façon de contourner ce problème est d'utiliser des procédures stockées avec un paramètre de sortie.

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

valeurs vous ne passez pas par défaut aux valeurs par défaut définies dans la procédure stockée elle-même. Et vous pouvez obtenir les résultats de votre variable de sortie.

-2
répondu Jereme Guenther 2017-01-26 18:10:47