SQL Serverストアドプロシージャのオプションパラメータ?


125

SQL Server 2008でいくつかのストアドプロシージャを作成していますが、ここでオプションの入力パラメーターの概念が可能かどうか疑問に思いますか?

使用したくないパラメーターには常にNULLを渡し、ストアドプロシージャの値を確認し、そこから取得できると思いますが、ここでコンセプトが利用できるかどうかに興味がありました。ありがとう!


2
Erlandのサイトを長く読んでください。彼は動的検索条件に関するいくつかの素晴らしい情報を持っています:sommarskog.se/dyn-search.html
Aaron Bertrand

回答:


201

このように宣言できます

CREATE PROCEDURE MyProcName
    @Parameter1 INT = 1,
    @Parameter2 VARCHAR (100) = 'StringValue',
    @Parameter3 VARCHAR (100) = NULL
AS

/* check for the NULL / default value (indicating nothing was passed */
if (@Parameter3 IS NULL)
BEGIN
    /* whatever code you desire for a missing parameter*/
    INSERT INTO ........
END

/* and use it in the query as so*/
SELECT *
FROM Table
WHERE Column = @Parameter

パラメータが一意の識別子のタイプである場合はどうなりますか?例。@userId uniqueidentifier
RK Sharma

1
疑問に思っている人のために@RKSharmaに答える-それはuniqueidentifiersでもまったく同じように機能します。
リヌックス2016年

55

はい、そうです。パラメータを次のように宣言します。

@Sort varchar(50) = NULL

これで、パラメータを渡す必要はありません。デフォルトでNULL(またはデフォルトで選択したもの)になります。


あなたも必要ありません= NULL
OMGポニー

3
本当に必要ないのですか?
マイクコール

43
OMGポニー、= <NULL | some default value>を含めない場合、パラメーターが必要になります。NULLとして渡すこともできますが、そのロジックを、プロシージャを使用するアプリケーションにシフトするだけです。
アーロンベルトラン

10
アーロンの要点に追加します。既存のストアドプロシージャに新しいオプションのパラメーターを追加する場合は、「= NULL」を使用することをお勧めします。その理由は、このプロシージャを呼び出すすべてのコードを認識していない可能性があるためです。したがって、 "= NULL"を使用してオプションにしない限り、値を渡すのに失敗した可能性があるすべての場所で、値が壊れます。
nanonerd 2017年

nanonerd:2014以降では、少なくともデフォルトを設定できます。そのパラメーターを渡さない場合でも、エラーは発生しません。少なくともそれは2014年に私のためにそれが私のために働いた方法
でした

0

2014以上では、デフォルトを設定できます。その場合、そのパラメーターを渡さない場合でも、エラーは発生しません。部分的な例:3番目のパラメーターがオプションとして追加されます。最初の2つのパラメータのみを使用した実際のプロシージャのexecは正常に機能しました

exec getlist 47,1,0

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