SQL Server存储过程中的可选参数?


Answers:


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
RK Sharma

1
回答@RKSharma的人也会想知道-它与uniqueidentifiers的作用相同。
rinukkusu

55

是的。这样声明参数:

@Sort varchar(50) = NULL

现在,您甚至不必传递参数。它将默认为NULL(或您选择默认为的任何值)。


您甚至不需要= NULL
OMG小马,

3
您确定不需要吗?
Mike Cole

43
OMG Ponies,如果不包含= <NULL |一些默认值>,则将需要该参数。您可以将其作为NULL传入,但随后只需将该逻辑转移到使用该过程的应用程序即可。
亚伦·贝特朗

10
添加到亚伦的观点。如果要将新的可选参数添加到现有的存储过程中,最好使用“ = NULL”。原因是,您可能不知道调用此proc的所有代码。因此,除非您使用“ = NULL”将其设置为可选,否则对于您可能错过传递值的所有位置,它将中断。
nanonerd

nanonerd:2014年及更高版本至少可以设置一个默认值,并且在不传递该参数时会采用该值,并且不会出现错误。至少这是2014年与我合作的方式
billpennock

0

2014年及以上的版本至少可以设置一个默认值,如果不传递该参数,它将采用该默认值,并且不会出现错误。部分示例:第三个参数作为可选添加。仅使用前两个参数的实际过程的执行程序工作正常

exec getlist 47,1,0

create procedure getlist
   @convId int,
   @SortOrder int,
   @contestantsOnly bit = 0
as
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.