33

これが私のコードです:

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


編集

このSOPOSTを見つけたので、重複している可能性があります

4

1 に答える 1

41

定数である必要があります。値は、プロシージャの作成時に計算可能である必要があり、1回の計算で常に使用される値を提供する必要があります。

の定義を見てくださいsys.all_parameters

default_value sql_variant が1の場合has_default_value、この列の値はパラメーターのデフォルトの値です。それ以外の場合、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


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

于 2013-01-03T13:29:50.513 に答える