Jed*_*Jed 5 dbnull stored-procedures sql-server-2008
我想创建一个存储过程(在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'
然后,在存储过程,我可以检查未定义的值-如果该参数瓦尔仍设置为NameIsUndefined,EmailIsUndefined和/或PhoneIsUndefined值,那么我可以安全地假定调用者没有明确定义这些PARAMS值.这是实现目标的唯一途径吗?
如果您声明这样的参数(没有默认值),则存储过程将需要它们中的所有四个,如果它们中的任何一个都不会传递给EXEC提供者组成的语句,则它们将失败.
您可以声明一些可选参数,如下所示:
@Phone nvarchar(20) = NULL
但是,如果省略或明确设置为sproc,将无法在sproc内部进行分析NULL.
AFAIK,没有办法区分 SQL Server 中的 NULL 和 NULL。
在你的 C# 代码中,我会 A) 传递另一个值,比如空字符串,以指示传递了一个空值,然后在 SQL 中处理该值,如果传递了该值,则将 NULL 写入数据库,或者如果传递了该值,则保留先前的值变量为 NULL,或 B) 不传递DBNull.Value,而是传递从数据库读取的先前值。
| 归档时间: | 
 | 
| 查看次数: | 2381 次 | 
| 最近记录: |