У меня есть хранимая процедура, которая имеет набор входных и выходных параметров, потому что это Вставляет значения в несколько таблиц. В некоторых случаях сохраненный proc только вставляет в единственную таблицу (в зависимости от входных параметров). Вот копируемый сценарий для иллюстрирования.
Таблицы / Объекты данных:
Человек
Id
Name
Address
Имя:
Id
FirstName
LastName
Адрес
Id
Country
City
Скажите, что у меня есть хранимая процедура, которая вводит человека. Если адрес не будет существовать, то я не добавлю его к Address
таблица в базе данных.
Таким образом, когда я генерирую код для вызова хранимой процедуры, я не хочу потрудиться добавлять Address
параметр. Для INPUT
параметры это в порядке, потому что SQL Server позволяет мне предоставлять значения по умолчанию. Но для OUTPUT
параметр, что я делаю в хранимой процедуре для создания этого дополнительным, таким образом, я не получаю ошибку...
Процедура или функция 'Person_InsertPerson' ожидают параметр '@AddressId', который не был предоставлен.
Как входным, так и выходным параметрам могут быть присвоены значения по умолчанию. В этом примере:
CREATE PROCEDURE MyTest
@Data1 int
,@Data2 int = 0
,@Data3 int = null output
AS
PRINT @Data1
PRINT @Data2
PRINT isnull(@Data3, -1)
SET @Data3 = @Data3 + 1
RETURN 0
первый параметр является обязательным, а второй и третий - необязательными - если они не установлены вызывающей программой, им будут присвоены значения по умолчанию. Попробуйте поработать с ним и следующей процедурой тестового вызова в SSMS, используя разные значения и настройки, чтобы увидеть, как все это работает вместе.
DECLARE @Output int
SET @Output = 3
EXECUTE MyTest
@Data1 = 1
,@Data2 = 2
,@Data3 = @Output output
PRINT '---------'
PRINT @Output
Поскольку вы выполняете хранимую процедуру, а не инструкцию SQL, вы должны установить тип команды для вашей команды SQL как Хранимая процедура:
cmd.CommandType = CommandType.StoredProcedure;
Взято из здесь .
Кроме того, как только вы удалите эту ошибку, вы можете использовать функцию SQL nvl ()
в своей процедуре, чтобы указать, что вы хотите отображать при обнаружении значения NULL.
Извините, что не ответил на вопрос должным образом ... должно быть, неправильно вас понял. Вот пример nvl, который, как мне кажется, может решить эту проблему немного лучше?
select NVL(supplier_city, 'n/a')
from suppliers;
Вышеупомянутый оператор SQL вернул бы 'n / a', если бы поле supplier_city
содержало нулевое значение. В противном случае он вернет значение supplier_city
.
Похоже, я могу просто добавить значение по умолчанию к параметру OUTPUT
, например:
@AddressId int = -1 Output
Похоже, это плохо с точки зрения читаемости, поскольку AddressId
предназначен строго как переменная OUTPUT
. Но это работает. Пожалуйста, дайте мне знать, если у вас есть лучшее решение.