Как определить, было ли значение параметра передано хранимой процедуре

Я хочу создать хранимую процедуру (в 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);
}

What I'm Попытка выполнить здесь заключается в том, что если вызывающий объект явно указывает значение NULL для параметра, я обновлю запись значением NULL . Однако, если пользователь явно игнорирует передачу параметра, то запрос UPDATE сохранит значение поля / столбца, которое уже установлено для конкретной записи (т.е. запрос НЕ будет обновлять этот конкретный столбец).

Я полагаю, что я мог бы указать значения по умолчанию, которые можно с уверенностью предположить, что вызывающий объект никогда не будет использовать - примерно так:

@ID int,
@Name nvarchar(50) = 'NameIsUndefined',
@Email nvarchar(80) = 'EmailIsUndefined',
@Phone nvarchar(20) = 'PhoneIsUndefined'

Затем в сохраненной процедуре я могу проверить неопределенные значения - если переменные параметров по-прежнему установлены значения NameIsUndefined , EmailIsUndefined и / или PhoneIsUndefined , тогда я могу с уверенностью предположить, что вызывающий не определил явно значения для этих параметров. Это единственный способ достичь моей цели?

5
задан marc_s 12 August 2011 в 17:49
поделиться