дополнительные параметры в SQL Server хранятся proc?


125

Я пишу несколько хранимых процедур в SQL Server 2008 и задаюсь вопросом, возможна ли здесь концепция необязательных входных параметров?

Полагаю, я всегда мог передать NULL для параметров, которые не хочу использовать, проверить значение в сохраненной процедуре, а затем взять что-то оттуда, но меня интересовало, доступна ли здесь концепция. Спасибо!


2
Внимательно прочтите сайт Эрланда, у него есть отличная информация об условиях динамического поиска: sommarskog.se/dyn-search.html
Аарон Бертран

Ответы:


201

Вы можете так заявить

CREATE PROCEDURE MyProcName
    @Parameter1 INT = 1,
    @Parameter2 VARCHAR (100) = 'StringValue',
    @Parameter3 VARCHAR (100) = NULL
AS

/* check for the NULL / default value (indicating nothing was passed */
if (@Parameter3 IS NULL)
BEGIN
    /* whatever code you desire for a missing parameter*/
    INSERT INTO ........
END

/* and use it in the query as so*/
SELECT *
FROM Table
WHERE Column = @Parameter

что, если параметр является типом uniqueidentifier? ех. @userId uniqueidentifier
РК Шарма

1
Отвечая на @RKSharma всем, кому тоже интересно - он работает точно так же с уникальными идентификаторами.
rinukkusu

55

Да, это так. Объявите параметр так:

@Sort varchar(50) = NULL

Теперь вам даже не нужно передавать параметр. По умолчанию он будет равен NULL (или тому, что вы выберете по умолчанию).


Вам даже не нужно= NULL
OMG Ponies

3
Вы уверены, что вам это не нужно?
Майк Коул

43
OMG Ponies, если вы не включите = <NULL | какое-то значение по умолчанию>, тогда параметр будет обязательным. Вы можете передать его как NULL, но затем вы просто перекладываете эту логику на приложения, которые используют процедуру.
Аарон Бертран

10
Дополнение к мысли Аарона. Лучше использовать "= NULL", если вы добавляете новый необязательный параметр к существующей сохраненной процедуре. Причина в том, что вы можете не знать ВСЕГО кода, который вызывает эту процедуру. Следовательно, если вы не сделаете это необязательным, используя "= NULL", для всех мест, которые вы могли пропустить, чтобы передать значение, оно сломается.
nanonerd 08

nanonerd: 2014 и выше, по крайней мере, вы можете установить значение по умолчанию, и оно будет принимать это, а НЕ ошибка, если вы не передадите этот параметр. По крайней мере, так это сработало для меня в 2014 году с
billpennock

0

2014 и выше, по крайней мере, вы можете установить значение по умолчанию, и оно будет принимать это, а НЕ ошибка, если вы не передадите этот параметр. Частичный пример: третий параметр добавлен как необязательный. exec реальной процедуры только с первыми двумя параметрами работал нормально

exec getlist 47,1,0

create procedure getlist
   @convId int,
   @SortOrder int,
   @contestantsOnly bit = 0
as
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.