web-dev-qa-db-fra.com

Procédure stockée avec paramètres par défaut

J'essaie de créer une procédure stockée basée sur une requête que j'ai écrite avec des paramètres prédéfinis.

Lors de la restructuration pour créer une procédure stockée et exécuter la procédure stockée, il est indiqué que les paramètres n'ont pas été fournis. Quelqu'un peut-il me dire pourquoi?

Je sais que j'ai manqué quelque chose d'essentiel, mais après avoir manipulé le code, j'en suis arrivé au point d'avoir besoin de l'aide d'experts.

Ceci est mon code (abrégé):

Alter Procedure [Test]
    @StartDate AS varchar(6), 
    @EndDate AS varchar(6)
AS
    Set @StartDate = '201620' --Define start YearWeek
    Set @EndDate  = (SELECT CAST(DATEPART(YEAR,getdate()) AS varchar(4)) + CAST(DATEPART(WEEK,getdate())-1 AS varchar(2)))

    SELECT 
        *
    FROM
        (SELECT DISTINCT 
             [YEAR], [WeekOfYear] 
         FROM 
             [dbo].[DimDate] 
         WHERE 
             [Year] + [WeekOfYear] BETWEEN @StartDate AND @EndDate) dimd
    LEFT JOIN 
        [Schema].[Table1] qad ON (qad.[Year] + qad.[Week of the Year]) = (dimd.[Year] + dimd.WeekOfYear)

Lorsque je lance la procédure, je reçois:

Msg 201, Niveau 16, Etat 4, Test de procédure, Ligne 0
La procédure ou la fonction 'test' attend le paramètre '@StartDate', qui n'a pas été fourni.

Merci d'avance.

19
TSQL_Newbie

J'ai écrit avec des paramètres prédéfinis

Ils ne sont pas "prédéfinis" logiquement, quelque part dans votre code. Mais comme arguments de SP, ils n'ont pas de valeur par défaut et sont obligatoires. Pour éviter de transmettre ces paramètres explicitement, vous devez définir des valeurs par défaut dans SP définition:

Alter Procedure [Test]
    @StartDate AS varchar(6) = NULL, 
    @EndDate AS varchar(6) = NULL
AS
...

NULL ou des chaînes vides ou quelque chose de plus raisonnable - à vous de choisir. Peu importe, vous écrasez les valeurs de ces arguments dans les premières lignes de SP.

Maintenant, vous pouvez l'appeler sans passer aucun argument, par exemple. exec dbo.TEST

31
Ivan Starostin

Je ferais cela de deux manières. Puisque vous définissez vos dates de début et de fin dans votre code t-sql, je ne demanderais pas de paramètres dans le processus stocké.

Option 1

Create Procedure [Test] AS
    DECLARE @StartDate varchar(10)
    DECLARE @EndDate varchar(10)
    Set @StartDate = '201620' --Define start YearWeek
    Set @EndDate  = (SELECT CAST(DATEPART(YEAR,getdate()) AS varchar(4)) + CAST(DATEPART(WEEK,getdate())-1 AS varchar(2)))

SELECT 
*
FROM
    (SELECT DISTINCT [YEAR],[WeekOfYear] FROM [dbo].[DimDate] WHERE [Year]+[WeekOfYear] BETWEEN @StartDate AND @EndDate ) dimd
    LEFT JOIN [Schema].[Table1] qad ON (qad.[Year]+qad.[Week of the Year]) = (dimd.[Year]+dimd.WeekOfYear)

Option 2

Create Procedure [Test] @StartDate varchar(10),@EndDate varchar(10) AS

SELECT 
*
FROM
    (SELECT DISTINCT [YEAR],[WeekOfYear] FROM [dbo].[DimDate] WHERE [Year]+[WeekOfYear] BETWEEN @StartDate AND @EndDate ) dimd
    LEFT JOIN [Schema].[Table1] qad ON (qad.[Year]+qad.[Week of the Year]) = (dimd.[Year]+dimd.WeekOfYear)

Puis lancez exec test '2016-01-01','2016-01-25'

1
jellz77