テーブルのPKに基づいてテーブルのレコードを更新するストアドプロシージャ(SQL Server 2008 R2)を作成したいと思います。
ストアドプロシージャには、たとえば、次の4つのパラメータがあります。
@ID int,
@Name nvarchar(50),
@Email nvarchar(80),
@Phone nvarchar(20)
ストアドプロシージャの呼び出し元が1つ(または複数)のパラメーターにNULL値を渡すかどうかと、呼び出し元が1つ(または複数)のパラメーターに何も渡さなかったかどうかを判断するにはどうすればよいですか?
C#の発信者の例:
発信者は以下を指定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", 'frank@frank.com');
cmd.Parameters.AddWithValue("@Phone", DBNull.Value);
DatabaseManager.instance.ExecuteScalarQuery(cmd);
}
@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", 'frank@frank.com');
DatabaseManager.instance.ExecuteScalarQuery(cmd);
}
ここで達成しようとしているのは、呼び出し元がパラメーターにNULL値を明示的に指定した場合、レコードをNULL
値で更新することです。ただし、ユーザーがパラメーターの受け渡しを明示的に無視した場合、UPDATE
クエリは特定のレコードに既に設定されているフィールド/列の値を保持します(つまり、クエリはその特定の列を更新しません)。
呼び出し元が決して使用しないと安全に想定できるデフォルト値を指定できると思います-次のようになります。
@ID int,
@Name nvarchar(50) = 'NameIsUndefined',
@Email nvarchar(80) = 'EmailIsUndefined',
@Phone nvarchar(20) = 'PhoneIsUndefined'
次に、ストアドプロシージャで、未定義の値を確認できます。パラメータvarsがまだ、、、および/または値NameIsUndefined
に設定されている場合は、呼び出し元がこれらのパラメータの値を明示的に定義していないと安全に推測できます。これが私の目標を達成する唯一の方法ですか?EmailIsUndefined
PhoneIsUndefined