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_valuesql_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()