parâmetros opcionais no processo armazenado do SQL Server?

125

Estou escrevendo alguns procs armazenados no SQL Server 2008 e me perguntei se o conceito de parâmetros de entrada opcionais é possível aqui.

Suponho que eu poderia sempre passar NULL para parâmetros que não quero usar, verificar o valor no processo armazenado e depois levar as coisas a partir daí, mas eu estava interessado se o conceito estivesse disponível aqui. Obrigado!

larryq
fonte
2
Dê uma longa leitura no site do Erland, ele tem alguma grande informação sobre condições de pesquisa dinâmicos: sommarskog.se/dyn-search.html
Aaron Bertrand

Respostas:

201

Você pode declarar assim

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
Raj More
fonte
e se o parâmetro for o tipo de identificador exclusivo? ex. @userId uniqueidentifier
RK Sharma
1
Respondendo ao @RKSharma para quem também está se perguntando - funciona da mesma forma com identificadores exclusivos.
Rinukkusu 29/03
55

Sim, ele é. Declare o parâmetro da seguinte maneira:

@Sort varchar(50) = NULL

Agora você nem precisa passar o parâmetro. O padrão será NULL (ou o que você escolher como padrão).

Mike Cole
fonte
Você não precisa mesmo de o= NULL
OMG Pôneis
3
Tem certeza de que não precisa disso?
Mike Cole
43
Pôneis OMG, se você não incluir = <NULL | algum valor padrão>, o parâmetro será necessário. Você pode transmiti-lo como NULL, mas depois basta mudar essa lógica para os aplicativos que usam o procedimento.
Aaron Bertrand
10
Adicionando ao argumento de Aaron. É melhor usar o "= NULL" se você estiver adicionando um novo parâmetro opcional a um processo armazenado existente. O motivo é que você pode não estar ciente de TODO o código que chama esse processo. Portanto, a menos que você o torne opcional usando o "= NULL", para todos os lugares que você perdeu em passar um valor, ele será interrompido.
Nanonerd
nanonerd: 2014 e acima, pelo menos, você pode definir um padrão e isso levará esse erro e NÃO quando você não passar esse parâmetro. Pelo menos essa é a maneira que funcionou para mim em 2014, com
billpennock
0

2014 e acima, pelo menos, você pode definir um padrão e isso levará esse erro e NÃO quando você não passar esse parâmetro. Exemplo parcial: o terceiro parâmetro é adicionado como opcional. exec do procedimento real com apenas os dois primeiros parâmetros funcionou bem

exec getlist 47,1,0

create procedure getlist
   @convId int,
   @SortOrder int,
   @contestantsOnly bit = 0
as
billpennock
fonte