5

我想创建一个存储过程(在 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 仍然设置为NameIsUndefinedEmailIsUndefined和/或PhoneIsUndefined值,那么我可以安全地假设调用者没有为这些参数显式定义值。这是实现我的目标的唯一方法吗?

4

2 回答 2

6

如果您像这样声明您的参数(没有默认值),则存储过程将需要所有四个参数,并且如果其中任何一个参数未传递给EXEC提供者组成的语句,则将失败。

您可以像这样声明一些可选参数:

@Phone nvarchar(20) = NULL

但是,将无法在 sproc 内部判断它是否被省略或显式设置为NULL.

于 2011-08-12T17:07:27.627 回答
1

AFAIK 无法区分 SQL Server 中的 NULL 和 NULL 之间的区别。

在您的 C# 代码中,我会 A) 传递另一个值,如空字符串,以指示传递了一个空值,然后在 SQL 中处理它以在传递该值时将 NULL 写入数据库,或者如果variable 为 NULL,或 B) 传递DBNull.Value从 DB 读取的前一个值,而不是传递。

于 2011-08-12T17:08:54.547 回答