Как определить, было ли передано значение параметра в хранимую процедуру - PullRequest
5 голосов
/ 12 августа 2011

Я хочу создать хранимую процедуру (в 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, то я могу смело предположить, что вызывающий не определил явно значения для этих параметров. Это единственный способ достичь моей цели?

Ответы [ 2 ]

6 голосов
/ 12 августа 2011

Если вы объявите свои параметры подобным образом (без значения по умолчанию), хранимый процесс потребует все четыре из них и просто потерпит неудачу, если какой-либо из них не будет передан в оператор EXEC, составленный поставщиком.

Вы можете объявить некоторые параметры необязательными, например:

@Phone nvarchar(20) = NULL

однако внутри sproc не будет возможности определить, было ли оно опущено или явно установлено на NULL.

1 голос
/ 12 августа 2011

Невозможно определить разницу между NULL и NULL в SQL Server, AFAIK.

В вашем коде на C # я бы: а) передал другое значение, например пустую строку, чтобы указать, что было передано пустое значение, затем обработал бы это в SQL, чтобы записать NULL в БД, если значение было передано, или сохранить предыдущее значение, если переменная равна NULL или B) Вместо передачи DBNull.Value передайте предыдущее значение, которое было прочитано из БД.

...