2011-08-12 14 views
4

テーブルのPKに基づいてテーブル内のレコードを更新するストアドプロシージャ(SQL Server 2008 R2)を作成したいとします。パラメータ値がストアドプロシージャに渡されたかどうかを確認する方法

ストアドプロシージャは、例えば、4つのパラメータがあります:

@ID int, 
@Name nvarchar(50), 
@Email nvarchar(80), 
@Phone nvarchar(20) 

ストアドプロシージャの呼び出し元が1つ(または複数)のNULL値を渡す場合、私は決定することができるどのようなパラメータの対場合呼び出し元はパラメータの1つ(またはそれ以上)に何も渡しませんでしたか?

C#の発信者例:

using (SqlCommand cmd = new SqlCommand()) 
{ 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "EditPerson"; 
    cmd.Parameters.AddWithValue("@ID", id); 
    cmd.Parameters.AddWithValue("@Name", 'Frank'); 
    cmd.Parameters.AddWithValue("@Email", '[email protected]'); 
    cmd.Parameters.AddWithValue("@Phone", DBNull.Value); 
    DatabaseManager.instance.ExecuteScalarQuery(cmd); 
} 

発信者が@Phoneパラメータを無視します:

発信者がNULL@Phoneのために指定

using (SqlCommand cmd = new SqlCommand()) 
{ 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "EditPerson"; 
    cmd.Parameters.AddWithValue("@ID", id); 
    cmd.Parameters.AddWithValue("@Name", 'Frank'); 
    cmd.Parameters.AddWithValue("@Email", '[email protected]'); 
    DatabaseManager.instance.ExecuteScalarQuery(cmd); 
} 

私は何をすれば、ISここで達成しようとしています呼び出し側がパラメータのNULL値を明示的に指定した場合は、レコードをNULLで更新します値。ただし、ユーザーが明示的にパラメータを渡すことを無視すると、UPDATEクエリは、特定のレコードに対して既に設定されているフィールド/列の値を保持します(クエリではその特定の列は更新されません)。

は私が安全に、発信者が使用することは決してありませんと仮定することができるデフォルト値を指定することができると仮定 - このような何かを:

@ID int, 
@Name nvarchar(50) = 'NameIsUndefined', 
@Email nvarchar(80) = 'EmailIsUndefined', 
@Phone nvarchar(20) = 'PhoneIsUndefined' 

その後、ストアドプロシージャでは、私は未定義の値をチェックすることができます - パラメータvarsがまだNameIsUndefinedEmailIsUndefined、および/またはPhoneIsUndefinedの値に設定されている場合、呼び出し元がこれらのパラメータの値を明示的に定義していないと見なすことができます。これが私の目標を達成する唯一の方法ですか?

+1

はい、異なる状態を表すには、NULL以外の値を使用する必要があります。そのため、NULL以外のデフォルトを設定するか、NULL以外の値を渡してください。値が渡されなかったことを示すためにNULLか他の値を使用するかどうかを選択します。 – nekno

答えて

1

SQL ServerのAFAIKでNULLとNULLの違いを判断する方法はありません。

あなたのC#コードでは、空の文字列のような別の値を渡して空の値が渡されたことを示し、値が渡された場合にNULLをDBに書き込むSQLで処理します。変数がNULLの場合は前の値、またはB)DBNull.Valueを渡す代わりに、DBから読み込まれた前の値を渡します。

6

このような(デフォルト値なしの)パラメータを宣言した場合、ストアドプロシージャは4つすべてを必要とし、いずれかがプロバイダによって作成されたEXECステートメントに渡されないと失敗します。

次のようなオプションのパラメータのいくつかを宣言することがあります。

@Phone nvarchar(20) = NULL

しかし、それは省略するか、明示的にNULLに設定されていた場合SPROCを内側に伝える方法がないでしょう。