存储过程参数默认值 - 这是常量还是变量

why*_*heq 31 sql stored-procedures sql-server-2008-r2

这是我的代码:

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
Run Code Online (Sandbox Code Playgroud)

SSMS对我使用的默认值不太满意- 在MSDN DEFINITION HERE中它表示默认值需要是常量而不是变量.

CONVERT(INT,(CONVERT(CHAR(8),GETDATE()-130,112)))一个变量或常量?它不是传统方式中的一个变量,我认为它是一个变量,但它又不是一个常数'03 jan 2013'.

我该如何解决这个问题?移动CONVERT(INT,(CONVERT(CHAR(8),GETDATE()-130,112)))到调用存储过程的客户端?


编辑

可能重复,因为我刚发现这个SO POST

Dam*_*ver 40

它必须是一个常量 - 该值必须在创建过程时可计算,并且一个计算必须提供将始终使用的值.

看看定义sys.all_parameters:

default_value sql_variant 如果has_default_value为1,则此列的值是参数的默认值; 否则,NULL.

也就是说,无论参数的默认值是什么,它都必须适合该列.


正如Alex K在评论中指出的那样,你可以这样做:

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

NULL不应将其作为有效值@StartDate.


至于您在评论中链接的博客文章 - 这是关于非常具体的上下文 - 在单个查询的上下文中进行评估的结果通常被认为是不变的.我不知道有多少人(与博客作者不同)会认为UDF中的单独表达式是与调用 UDF 的查询相同的查询的一部分.GETDATE()