テーブルの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がまだNameIsUndefined
、EmailIsUndefined
、および/またはPhoneIsUndefined
の値に設定されている場合、呼び出し元がこれらのパラメータの値を明示的に定義していないと見なすことができます。これが私の目標を達成する唯一の方法ですか?
はい、異なる状態を表すには、NULL以外の値を使用する必要があります。そのため、NULL以外のデフォルトを設定するか、NULL以外の値を渡してください。値が渡されなかったことを示すためにNULLか他の値を使用するかどうかを選択します。 – nekno