web-dev-qa-db-ja.com

ストアドプロシージャパラメータのデフォルト値-これは定数または変数です

ここに私のコードがあります:

_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)))をストアドプロシージャを呼び出しているクライアントに移動しますか?


[〜#〜] edit [〜#〜]

私がこれを見つけたばかりの可能性のある複製 SO POST

31
whytheq

それはconstantでなければなりません-値はプロシージャが作成されるときに計算可能でなければならず、1つの計算は常に使用される値を提供しなければなりません。

_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_の有効な値であることを意図していない場合。


コメントでリンクしているブログ投稿について-それは非常に特定のコンテキストについて話している-それは、resultのコンテキスト内でGETDATE()を評価した結果singleクエリは、定数と見なされることがよくあります。 UDF内の別の式を、UDFをcallsするクエリと同じクエリの一部と見なす多くの人々(ブログの著者とは異なり)を知りません。

40