【问题标题】:Stored Procedure parameter default value - is this a constant or a variable存储过程参数默认值 - 这是常量还是变量
【发布时间】:2013-01-03 11:21:04
【问题描述】:

这是我的代码:

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

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

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


编辑

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

【问题讨论】:

  • GETDATE() 的结果因时间而异,因此它不可能是恒定的。使用 NULL/a 魔法值作为默认值,检测它并在匹配时分配您的表达式。
  • @AlexK。我不确定你是否正确:GETDATE() 在被调用时肯定会被评估,然后是常量。见these blog posts - 值得商榷

标签: sql stored-procedures sql-server-2008-r2


【解决方案1】:

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

sys.all_parameters的定义:

default_valuesql_variant如果has_default_value为1,则该列的值为参数的默认值;否则,NULL

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


正如 Alex K 在 cmets 中指出的那样,您可以这样做:

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 的有效值。


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

【讨论】:

  • 这个解决方案+1。如果我将has to be computable at the time that the procedure is created, 更改为has to be computable at the time that the procedure is executed,,这绝对是一个微妙的区别,那么就存储过程而言,GETTIME() 将是一个常量。喜欢COALESCE的使用我用IF @StartDate IS NULL ...
  • @whytheq - 如果它只需要在程序执行时是可计算的,那么当时不会允许什么?
  • ...如果执行需要 2 分钟,并且我将 @StartDate 设置为传统变量,例如 @StartDate INT = @x,然后最初将 @x 设置为“2013 年 1 月 1 日”,然后在 proc 中更改它到“2013 年 1 月 2 日”,那么我会说这无疑是一个变量,而不是一个常数;有点毛骨悚然。
  • 实际上,has_default 值根本不起作用。在2006 上发布了一个关于此的连接,但问题仍未解决 - connect.microsoft.com/SQLServer/feedback/details/234143/…
  • @VenkataramanR - COALESCE 是“从这个列表中返回第一个非空参数”。 @StartDate 是这里的第一个参数。如果它不为空,则相当于一个无害的@StartDate = @StartDate 赋值。
猜你喜欢
  • 2012-08-06
  • 2017-12-27
  • 2014-03-23
  • 2020-09-09
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多