我希望创建一个存储过程(在SQL Server 2008 R2中),该存储过程将根据表的主键更新表中的记录。
例如,存储过程将具有四个参数:
@ID int,
@Name nvarchar(50),
@Email nvarchar(80),
@Phone nvarchar(20)
我如何确定存储过程的调用者是否为一个或多个参数传递了NULL值,还是调用者没有为一个或多个参数传递任何内容?
C# 调用者示例:
调用者为 @Phone
指定了 NULL
值:
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'
然后,在存储过程中,我可以检查未定义的值——如果参数变量仍设置为NameIsUndefined
,EmailIsUndefined
和/或PhoneIsUndefined
值,则我可以安全地假设调用方未显式定义这些参数的值。这是实现我的目标的唯一方法吗?