这是我的代码:
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
答案 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的查询相同的查询的一部分。