33

这是我的代码:

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对我使用的默认值不太满意- 在MSDN DEFINITION HERE中,它说默认值需要是常量而不是变量。

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

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


编辑

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

4

1 回答 1

41

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

看看 的定义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))))

前提是NULL它不是 . 的有效值@StartDate


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

于 2013-01-03T13:29:50.513 回答