我正在SQL Server 2008中编写一些存储过程。这里是否支持可选输入参数的概念?
我想我可以始终将不想使用的参数传入NULL,检查存储过程中的值,然后从那里开始处理,但我想知道这里是否支持该概念。
我正在SQL Server 2008中编写一些存储过程。这里是否支持可选输入参数的概念?
我想我可以始终将不想使用的参数传入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
是的,没错。将参数声明为:
@Sort varchar(50) = NULL
现在你甚至不需要传递参数。它将默认为NULL(或您选择的任何默认值)。
= NULL
。 - OMG Poniesexec
)实际过程是正常的。exec getlist 47,1,0
create procedure getlist
@convId int,
@SortOrder int,
@contestantsOnly bit = 0
as
前面的答案中提到的默认值只适用于简单情况。在更复杂的情况下,我会在存储过程的开头附近使用IF子句来提供一个值,如果参数为NULL或空,并且需要进行计算。
我经常在WHERE子句中使用可选参数,并发现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