Подтвердить что ты не робот

Значение по умолчанию для хранимой процедуры - это константа или переменная

Вот мой код:

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 ЗДЕСЬ он говорит, что значение по умолчанию должно быть константой, а не переменной.

Является ли CONVERT(INT,(CONVERT(CHAR(8),GETDATE()-130,112))) переменной или константой? Это не переменная традиционным образом, я думаю о переменной, но опять же она не такая константа, как '03 jan 2013'.

Как мне обойти это? Переместить CONVERT(INT,(CONVERT(CHAR(8),GETDATE()-130,112))) клиенту, который вызывает хранимую процедуру?


ИЗМЕНИТЬ

Возможный дубликат, поскольку я только что заметил этот SO POST

4b9b3361

Ответ 1

Он должен быть константой - значение должно быть вычислимым в момент создания процедуры и что одно вычисление должно предоставлять значение, которое всегда будет использоваться.

Посмотрите на определение sys.all_parameters:

default_value sql_variant Если has_default_value равно 1, значение этого столбца является значением по умолчанию для параметра; в противном случае NULL.

То есть, независимо от значения по умолчанию для параметра, он должен соответствовать этому столбцу.


Как заметил Алекс К в комментариях, вы можете просто сделать:

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.