ここに私のコードがあります:
_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
それは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するクエリと同じクエリの一部と見なす多くの人々(ブログの著者とは異なり)を知りません。