J'essaie de créer une procédure stockée qui renverra les lignes WHERE Date de création entre la valeur «start» et «end». Mais je veux envisager la possibilité de valeurs vides pour la procédure stockée, j'ai donc besoin de valeurs par défaut.

CREATE PROCEDURE [dbo].[GetProjectsRatingByCreationDateInterval]
    @Start DATETIME = GETDATE,
    @End DATETIME = DATEADD(MONTH, -1, GETDATE())
AS
    SELECT 
        ID, ProjectName, Rating, CreationDateTime 
    FROM 
        Projects 
    WHERE 
        CreationDateTime BETWEEN @Start AND @End

J'ai essayé de faire cela comme ça mais j'ai reçu cette erreur:

Syntaxe incorrecte à côté de '('.

Il fait référence à l'appel de fonction DATEADD dans la déclaration @End.

1
Maxim Baranov 20 nov. 2018 à 08:53

4 réponses

Meilleure réponse

Veuillez définir la valeur comme Null et définir la procédure à l'intérieur comme ci-dessous

CREATE PROCEDURE [dbo].[GetProjectsRatingByCreationDateInterval]

    @Start DATETIME  NULL,
    @End DATETIME NULL
AS

IF @Start is null   
    SET @Start = GETDATE()

IF @End is null     
SET @End = DATEADD(MONTH, -1, GETDATE())

    SELECT 
        ID, ProjectName, Rating, CreationDateTime 
    FROM 
        Projects 
    WHERE 
        CreationDateTime BETWEEN @Start and @End 
1
ravi polara 20 nov. 2018 à 06:42

Le problème est là

@Start DATETIME = GETDATE,

Getdate est une fonction alors écrivez-la comme GETDATE ()

@Start DATETIME = GETDATE(),

La procédure ressemble à ça

    CREATE PROCEDURE [dbo].[GetProjectsRatingByCreationDateInterval]
        @Start DATETIME = GETDATE(),
        @End DATETIME = DATEADD(MONTH, -1, GETDATE())
    AS
    BEGIN
        SELECT 
            ID, ProjectName, Rating, CreationDateTime 
        FROM 
            Projects 
        WHERE 
            CreationDateTime BETWEEN @Start AND @End
     END
1
Ravi 20 nov. 2018 à 07:12

Vous pouvez utiliser le code ci-dessous pour vos besoins.

CREATE PROCEDURE [dbo].[GetProjectsRatingByCreationDateInterval]
    @Start DATETIME = CURRENT_TIMESTAMP,
    @End DATETIME = NULL
AS
    SELECT 
        ID, ProjectName, Rating, CreationDateTime 
    FROM 
        Projects 
    WHERE 
        CreationDateTime BETWEEN @Start AND (CASE WHEN @End IS NULL THEN DATEADD(MONTH, -1, @Start) ELSE @End END)
0
Rahul Neekhra 20 nov. 2018 à 06:50

Vous pouvez également utiliser la fonction ISNULL() pour définir par défaut une valeur si ce qui a été passé est un NULL:

CREATE PROCEDURE dbo.GetProjectsRatingByCreationDateInterval
    @Start DATETIME NULL, @End DATETIME NULL
AS
BEGIN
    SET @Start = ISNULL(@Start, GETDATE());
    SET @End = ISNULL(@Start, DATEADD(MONTH, -1, GETDATE()));

    SELECT ID, ProjectName, Rating, CreationDateTime
    FROM Projects
    WHERE CreationDateTime BETWEEN @Start AND @End;
END;
0
Evaldas Buinauskas 20 nov. 2018 à 07:18