我想创建一个存储过程(在 SQL Server 2008 R2 中),它将根据表的 PK 更新表中的记录。
例如,存储过程将具有四个参数:
@ID int,
@Name nvarchar(50),
@Email nvarchar(80),
@Phone nvarchar(20)
如何确定存储过程的调用者是否为一个(或多个)参数传递了 NULL 值,与调用者是否没有为一个(或多个)参数传递任何内容?
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
值,那么我可以安全地假设调用者没有为这些参数显式定义值。这是实现我的目标的唯一方法吗?