web-dev-qa-db-fra.com

Valeur par défaut du paramètre de procédure stockée - est-ce une constante ou une variable

Voici mon code:

USE [xxx]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[problemParam] 
    @StartDate INT = CONVERT(INT,(CONVERT(CHAR(8),GETDATE()-130,112))),
    @EndDate INT = NULL
AS  
BEGIN

SSMS n'est pas trop satisfait de la valeur par défaut que j'ai utilisée - dans DÉFINITION MSDN ICI il indique que la valeur par défaut doit être une constante plutôt qu'une variable.

CONVERT(INT,(CONVERT(CHAR(8),GETDATE()-130,112))) est-elle une variable ou une constante? Ce n'est pas une variable de la manière traditionnelle, je pense à une variable, mais là encore ce n'est pas une constante comme '03 jan 2013'.

Comment puis-je contourner cela? Déplacer CONVERT(INT,(CONVERT(CHAR(8),GETDATE()-130,112))) vers le client qui appelle la procédure stockée?


[~ # ~] modifier [~ # ~]

Copie possible car je viens de repérer ceci SO POST

31
whytheq

Elle doit être une constante - la valeur doit être calculable au moment de la création de la procédure, et qu'un calcul doit fournir la valeur qui sera toujours utilisée.

Regardez la définition de sys.all_parameters :

default_valuesql_variant Si has_default_value vaut 1, la valeur de cette colonne est la valeur de la par défaut pour le paramètre; sinon, NULL.

Autrement dit, quelle que soit la valeur par défaut d'un paramètre, il doit tenir dans cette colonne.


Comme l'a souligné Alex K dans les commentaires, vous pouvez simplement faire:

CREATE PROCEDURE [dbo].[problemParam] 
    @StartDate INT = NULL,
    @EndDate INT = NULL
AS  
BEGIN
   SET @StartDate = COALESCE(@StartDate,CONVERT(INT,(CONVERT(CHAR(8),GETDATE()-130,112))))

à condition que NULL ne soit pas destiné à être une valeur valide pour @StartDate.


En ce qui concerne le billet de blog auquel vous avez lié dans les commentaires - qui parle d'un contexte très spécifique - que, le résultat d'évaluation de GETDATE() dans le contexte d'un single la requête est souvent considérée comme constante. Je ne connais pas beaucoup de gens (contrairement à l'auteur du blog) qui considéreraient une expression distincte dans un UDF comme faisant partie de la même requête que la requête qui appelle l'UDF.

40