デフォルトのパラメーター値としてのSQL関数?


105

これでデフォルトのパラメーター値を変更してみました:

ALTER PROCEDURE [dbo].[my_sp]
@currentDate datetime = GETDATE()

そしてSQLプリコンパイラが私に与えたすべてはこのエラーでした:

メッセージ102、レベル15、状態1、プロシージャmy_sp、行8 '('付近の構文が正しくありません。

手順はすでに作成済みです。(それが関連するかどうかはわかりません。)私はnullのデフォルト値を使用し、後でそれをチェックしていましたが、それは適切ではないようです。これを1行で行うことはできますか?


更新:私は、MSDNのストアドプロシージャのパラメーターの説明から離れていました。

[= default]パラメーターのデフォルト値です。デフォルト値が定義されている場合、そのパラメーターの値を指定せずに関数を実行できます。

注:
varchar(max)およびvarbinary(max)データ型を除くCLR関数には、デフォルトのパラメーター値を指定できます。

関数のパラメーターにデフォルト値がある場合、関数を呼び出してデフォルト値を取得するときにキーワードDEFAULTを指定する必要があります。この動作は、パラメータを省略するとデフォルト値も含まれるストアドプロシージャで、デフォルト値を持つパラメータを使用する場合とは異なります。

私はこれを間違って読んでいますか?

どうもありがとう。

回答:


160

ストアドプロシージャパラメータのデフォルト値は定数でなければなりません。次のことを行う必要があります...

ALTER Procedure [dbo].[my_sp]
@currentDate datetime = null
AS
IF @currentDate is null
SET @currentDate = getdate()

36
またはSET @currentDate = COALESCE(@ currentDate、GETDATE())
SQLMenace

以前使っていました。「私はnullのデフォルト値を使用し、後でそれをチェックしていましたが、適切ではないようです。」それでもブライアンに感謝します。
user58044 2009年

このソリューションは完璧です。
R.Katnaan 2017

35

私はそれが可能だとは思わない、あなたはデフォルトとしてリテラル(定数)値を使用する必要があります。

ただし、これは可能です。

Set @currentDate = Coalesce(@currentDate , GetDate())

13

次のように試すことができます:

Set @CurrentDate=IsNull(@CurrentDate,GetDate())

8

あなたの例では角括弧からMicrosoft SQL Serverを使用していると思います。

MSDNから:

文字列などの定数値のみ。スカラー関数(システム、ユーザー定義、またはCLR関数)。またはNULLをデフォルトとして使用できます。

この関数GETDATE()は時々異なる値を返すため、定数式ではありません。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.