gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:57:05 24 4
gpt4 key购买 nike

这是我的代码:

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

最佳答案

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

查看 sys.all_parameters 的定义:

default_value sql_variant If has_default_value is 1, the value of this column is the value of the default for the parameter; otherwise, 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的查询属于同一查询。

关于sql - 存储过程参数的默认值-这是常量还是变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14137925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com