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
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_value
sql_variant
Sihas_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.