У меня может быть дополнительный Выходной параметр в хранимой процедуре?

У меня есть хранимая процедура, которая имеет набор входных и выходных параметров, потому что это Вставляет значения в несколько таблиц. В некоторых случаях сохраненный proc только вставляет в единственную таблицу (в зависимости от входных параметров). Вот копируемый сценарий для иллюстрирования.

Таблицы / Объекты данных:

Человек

Id
Name
Address

Имя:

Id
FirstName
LastName

Адрес

Id
Country
City

Скажите, что у меня есть хранимая процедура, которая вводит человека. Если адрес не будет существовать, то я не добавлю его к Address таблица в базе данных.

Таким образом, когда я генерирую код для вызова хранимой процедуры, я не хочу потрудиться добавлять Address параметр. Для INPUT параметры это в порядке, потому что SQL Server позволяет мне предоставлять значения по умолчанию. Но для OUTPUT параметр, что я делаю в хранимой процедуре для создания этого дополнительным, таким образом, я не получаю ошибку...

Процедура или функция 'Person_InsertPerson' ожидают параметр '@AddressId', который не был предоставлен.

69
задан ollazarev 28 April 2014 в 08:50
поделиться

3 ответа

Как входным, так и выходным параметрам могут быть присвоены значения по умолчанию. В этом примере:

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
108
ответ дан 24 November 2019 в 13:49
поделиться

Поскольку вы выполняете хранимую процедуру, а не инструкцию 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 .

1
ответ дан 24 November 2019 в 13:49
поделиться

Похоже, я могу просто добавить значение по умолчанию к параметру OUTPUT, например:

@AddressId int = -1 Output

Похоже, это плохо с точки зрения читаемости, поскольку AddressId предназначен строго как переменная OUTPUT. Но это работает. Пожалуйста, дайте мне знать, если у вас есть лучшее решение.

4
ответ дан 24 November 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: