Настройка SqlParameter по умолчанию

Я оставляю параметр SqlValue моего SqlParameter неустановленным, чтобы указать, что для параметра должно быть установлено значение по умолчанию. Это согласно Документация MSDN:

Используйте null или не устанавливайте SqlValue, чтобы использовать значение по умолчанию для параметра.

Когда я пытаюсь выполнить SqlCommand, связанный с SqlParameter, я получаю сообщение об ошибке SQL, жалующееся на то, что

параметризованный запрос '...' ожидает параметр '@p0', который не был предоставлен.

Проблема в том, что сгенерированный запрос вызывает sp_executesql без указания того, что параметр может иметь значение по умолчанию.

Сгенерированный SQL (проблемный):

exec sp_executesql N'INSERT [dbo].[WithDefault] ([Field]) VALUES (@p0);',N'@p0 int',@p0=default

Правильный SQL:

exec sp_executesql N'INSERT [dbo].[WithDefault] ([Field]) VALUES (@p0);',N'@p0 int=default',@p0=default

(Обратите внимание =default после @p0 int)

Вопрос:

Как настроить SqlParameter так, чтобы он включал =default вместе с типом данных параметра?

Я бы представил что-то вроде:

param.DbType = System.Data.DbType.Int32;
param.IsDefaultable = true; // but this property doesn't exist

person Ben Gribaudo    schedule 20.07.2015    source источник
comment
Вы указали правильный способ сделать это в своем вопросе. Используйте null или не устанавливайте SqlValue для использования значения по умолчанию для параметра. Вы не делаете ни одну из этих двух вещей. В вашей процедуре должно быть определено значение по умолчанию, чтобы это работало правильно.   -  person Sean Lange    schedule 20.07.2015
comment
@SeanLange, сгенерированный SQL — это то, что я получу, если оставлю SqlValue неустановленным. Для целевой таблицы определено значение по умолчанию (CREATE TABLE WithDefault (Field INT NOT NULL DEFAULT(1));).   -  person Ben Gribaudo    schedule 20.07.2015
comment
Почему бы не использовать для этого хранимую процедуру? Это заставит эту проблему решиться, и вы получите приложение с разделением слоев. Я вижу проблему, с которой вы столкнулись, но это не то, с чем я сталкиваюсь, потому что я использую хранимые процедуры для всего.   -  person Sean Lange    schedule 20.07.2015


Ответы (1)


Что я могу придумать, так это использование COALESCE() и передача NULLs. Например:

EXECUTE sp_executesql N'SELECT COALESCE(@p0, 15);', N'@p0 INT', @p0 = NULL;

Но это, кажется, не соответствует вашему кондиционеру.

Кроме этого, я не знаю, возможно ли это.

person Evaldas Buinauskas    schedule 20.07.2015