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

ID が 1 の人は裸足で 5 番目の帽子をかぶらなければならないことを効果的に伝えます。

exec UpdateOutfit @id=1, @newHat=5

この人に、現在のブーツを維持したまま 5 番目の帽子を着用するように指示するものは何ですか?

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

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

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

4

5 に答える 5

1

いいえ、デフォルトの null は、渡された null と同じように「見えます」

おそらくデフォルトを-1にして、ロジックを使用して何か違うことをしてください。

于 2009-05-07T21:38:39.770 に答える
1

私の推測では、この 2 つのことを区別することはできません。

私の提案は、引数として決して渡さないデフォルト値を使用することです。つまり、デフォルトが の場合、値としてnull渡すことができます0@newBoots

于 2009-05-07T21:38:57.117 に答える
0

前述のように、TSQL は既定値を指定することと値を指定しないことを区別しません。エンジンは基本的に、欠落しているパラメーター (または DEFAULT キーワードで呼び出されたパラメーター) をデフォルト値に置き換えると思います。

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

BIT データ型の観点から考えてみてください。データ型は、バイナリ値 (1 または 0、またはブール値として考える場合は T/F) を表すように定義されています。NULL を有効な値として扱うことにより、バイナリ オプションを超えてデータ型を拡張しました (現在1/0/NULL の 3 つのオプションがあります。) 現在のデータ型の値が不足している場合は、使用している型が小さすぎることを常にお勧めします。

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

于 2009-05-07T22:20:45.160 に答える
0

厳密に言えば、これを実現する実際の機能はありません。ただし、これを示すために、パラメーターにある種の予約値 (たとえば、非常に小さい負の数) を使用してみることができます。

于 2009-05-07T21:39:36.350 に答える