Я хочу создать хранимую процедуру (в SQL Server 2008 R2), которая будет обновлять запись в таблице на основе PK таблицы.
Сохраненный процесс будет иметь, например, четыре параметра:
@ID int,
@Name nvarchar(50),
@Email nvarchar(80),
@Phone nvarchar(20)
Как я могу определить, передает ли вызывающая сторона хранимого процесса значение NULL для одного (или нескольких) параметров по сравнению с тем, не передает ли вызывающая сторона ничего для одного (или нескольких) параметров?
Пример вызывающего абонента С#:
Вызывающий указывает 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", '[email protected]');
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", '[email protected]');
DatabaseManager.instance.ExecuteScalarQuery(cmd);
}
Что я пытаюсь здесь сделать, так это то, что если вызывающая сторона явно указывает значение NULL для параметра, я обновлю запись значением NULL
. Однако, если пользователь явно игнорирует передачу параметра, то запрос UPDATE
сохранит значение поля/столбца, которое уже установлено для конкретной записи (т. е. запрос НЕ будет обновлять этот конкретный столбец).
Я полагаю, что мог бы указать значения по умолчанию, которые можно с уверенностью предположить, что вызывающая сторона никогда не будет их использовать - что-то вроде этого:
@ID int,
@Name nvarchar(50) = 'NameIsUndefined',
@Email nvarchar(80) = 'EmailIsUndefined',
@Phone nvarchar(20) = 'PhoneIsUndefined'
Затем в хранимой процедуре я могу проверить неопределенные значения - если переменные параметров все еще установлены на значения NameIsUndefined
, EmailIsUndefined
и/или PhoneIsUndefined
, то я могу с уверенностью предположить, что вызывающая сторона явно не определила значения для этих параметров. . Это единственный способ достичь моей цели?