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

时间:2013-01-03 11:21:04

标签: 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

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

1 个答案:

答案 0 :(得分: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))))

前提是NULL并非旨在成为@StartDate的有效值。


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