2009-05-07 12 views
0

は、ここで私が何をしたいです:デフォルトのパラメータ値を渡すか、パラメータを渡すことはありませんか?

テーブル

PeopleOutfit (id int primary key, boots int, hat int) 

そしてストアドプロシージャを考える

UpdateOutfit @id int, @newBoots int = null, @newHat = null 

私は

exec UpdateOutfit @id=1, @newBoots=null, @newHat=5 
としてこのプロシージャを呼び出したかどうかを指示する方法はあります

1のIDを持つユーザーが裸足であることと、彼の現在のブーツを保つ第五帽子を着用して、この人に指示し

exec UpdateOutfit @id=1, @newHat=5 

から第五帽子をかぶりますか?

つまり、「ストアドプロシージャ内で「指定されていないためにデフォルト値が使用されました」」から「このプロシージャを明示的に呼び出すと、デフォルトの値と同じ値が渡されます"

私は、XMLやフィールドのビットマスクを更新するなどのやりたいことを達成するためのいくつかの方法があると知っていますが、現時点ではこの正確な技術が可能かどうかを確認したいだけです。

編集:ビットなどの小さい範囲の種類のフィールドでは、予約済みの値を渡すことができません。プロシージャのオーバーロードも許容されないオプションです。追加の "NotAValue"値でNULLのパラダイムを拡張するユーザー定義型を作成することは答えかもしれませんが、実装する方法についてのいくつかのガイダンスが必要です。

答えて

1

私の推測は、いいえ、あなたはそれらの2つのものを区別することはできません。

私が提案するのは、決して引数として渡されないデフォルト値を使用することです。デフォルトはnullある場合、すなわち、多分あなたは厳密に@newBoots

+0

これは方法ですが、これはビットフィールドの問題です。 –

1

なし、デフォルトのnullはヌル

に渡された可能性があなたのデフォルトを作る-1と異なる何かをするためのロジックを使用すると同じように「見えます」。

0

の値として0に渡すことができ、いや、これを達成するための本当の機能はありません。しかし、これを示すために、ある種の予約された値(例えば、非常に小さな負の数)を使用してみることができます。

0

これは決して自分ではできません。ビット状態を扱うために、3つの状態ビットを(整数を使用して)いくつかのコードに導入しました。私はSQLサーバーにアクセスする必要はありませんが、私は時には究極の思考が好きです。しかし、私はあなたがいくつかの管理ビュー/機能を介して文字列の操作をそれを把握することができるかもしれないと思う。あなたは特権の多くの一体で実行する必要があるでしょうが、私はドン絶対にneccessaryその場合、述べたように、あなたがこの

SELECT 
    st.text 
FROM 
    sys.dm_exec_requests r 
CROSS APPLY 
    sys.dm_exec_sql_text(sql_handle) AS st 
WHERE 
    r.session_id = @@SPID 
+0

まあ...私はあなたの提案を正確に理解していないが、私は考えを持っていると思うし、アイデアが反映されていると思う。私の質問の真の目的は、オーバーヘッドを減らすことです。複雑なサブクエリは、このためのコストのかからないソリューションであるため、答えはありません。とにかく良いアイデア! –

+0

彼は実行された実際のTSQLステートメントの取得について話しています。 SQL Serverは実行されたすべてのSQLコマンドを記録し、システムビューからそれらを見ることができます。残念ながら、彼が提供したビューはコンパイルされたステートメントを返します。つまり、ストアドプロシージャ内から取得するのは、呼び出したコードではなくストアドプロシージャの定義だけです。 – Rick

0

のようなものを使用してst.textからそれをうまくカントなぜtは見、TSQLはdoesnの」デフォルト値の指定と値の指定は区別されません。私はエンジンが基本的に欠落しているパラメータ(またはDEFAULTキーワードで呼び出されたパラメータ)の代わりにデフォルト値を代用すると考えています。

代わりに0を「No Hat」として、NULLをパラメータなしとして使用します。これは、NULLの使用が推奨されます。値が不明であるか指定されていないことを意味します。 「No Hat」としてNULLを使用することで、データ型の範囲に余分な値を追加することに同意しました。

BITデータ型に関して考えてみましょう。データ型は、バイナリ値(1または0、またはブール値と考えるのが望ましい場合はT/F)を表すように定義されています。NULLを有効な値として扱うことで、データ型をバイナリオプション3つのオプション、1/0/NULL。)あなたが現在のデータ型の値を使い果たした場合、あなたは小さすぎる型を使用しています。

ストアドプロシージャ呼び出しに戻る。デフォルト値をNULLに設定し、NULLを設定しないか指定しなかった場合、呼び出し側はprocを呼び出すときに常にnull以外の値を指定する必要があります。 NULLを取得した場合は、値を指定しなかったか、NULLを指定したか、またはDEFAULTキーワードを使用したと仮定します。

関連する問題