SQLServer 存储过程中的可选参数?

我在 SQLServer2008中编写了一些存储进程,想知道可选输入参数的概念在这里是否可行?

我想我总是可以为我不想使用的参数传入 NULL,检查存储过程中的值,然后从中获取信息,但是我感兴趣的是这里是否可以使用这个概念。谢谢!

314871 次浏览

是的,它是。如下声明参数:

@Sort varchar(50) = NULL

现在甚至不需要传入参数。它将默认为 NULL (或者任何您选择的默认值)。

你可以这样申报

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

2014及以上,至少你可以设置一个默认值,它将采取该和 NOT 错误,当你不传递该参数。部分示例: 添加第3个参数作为可选参数。仅使用前两个参数的实际过程的 exec 运行良好

exec getlist 47,1,0


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

上面提到的默认设置只适用于简单的情况。在更复杂的情况下,如果参数为 NULL 或空且需要进行计算,则在 proc 的开头附近使用 IF 子句来提供值。

我经常在 WHERE 子句中使用可选的 parms,发现 SQL 不会短路逻辑,因此使用 CASE 语句确保不要尝试计算 NULL 或空日期或唯一标识符,如下所示:

CREATE Procedure ActivityReport
(
@FromDate varchar(50) = NULL,
@ToDate varchar(50) = NULL
)


AS


SET ARITHABORT ON


IF @ToDate IS NULL OR @ToDate = '' BEGIN
SET @ToDate = CONVERT(varchar, GETDATE(), 101)
END


SELECT ActivityDate, Details
FROM Activity
WHERE
1 = CASE
WHEN @FromDate IS NULL THEN 1
WHEN @FromDate = '' THEN 1
WHEN ActivityDate >= @FromDate AND ActivityDate < DATEADD(DD,1,@ToDate) THEN 1
ELSE 0
END