2009-10-05 71 views
5

我想知道是否有反正我可以将我的一个存储过程参数设置为可选。SQL Server:存储过程中的可选变量

IF @thing_id <> '' 
BEGIN 
SET @sFiltre = @sFiltre + ' AND OPERES.OPE_THING = ' + CONVERT(VARCHAR,@thing_id) 
END 

回答

7

向存储过程参数提供默认值将使其成为可选参数。

编辑:

CREATE PROC [EDURE] [所有者。 ]
procedure_name [;数]
[{@parameter DATA_TYPE}
[VARYING] [=缺省] [OUTPUT]
] [,... n]的

默认

是该参数的默认值。 如果定义了默认值,则可以在不指定该参数的 值的情况下执行过程 。默认 必须是常量或可以是NULL。 如果过程使用带有LIKE关键字的参数,它可以包含通配符(%, _,[]和[^])。

请参阅 - http://msdn.microsoft.com/en-us/library/aa258259%28SQL.80%29.aspx

3

是。列表中的参数列表的末尾“可选”的参数,并给他们一个默认值(通常为NULL):

CREATE PROCEDURE MyProcedure 
    @param1 int, 
    @param2 varchar(200), 
    @thing_id int = NULL 
AS 

    If @thing_id IS NULL Begin 
     /* ... */ 
    End 

END 
+0

@Joel:是否有必要拥有可选参数,朝着结束了吗?我认为,从可用性的角度来看最好。是对的吗? – shahkalpesh 2009-10-05 14:18:32

+0

不,但绝对是最佳做法。 – 2009-10-05 14:27:47

14

当您创建存储过程,创建这样

Create Proc MyProc 
@Param1 VarChar (20), 
@Param2 VarChar (20) = NULL 
AS 

-- Your code here 

GO 

参数1时强制性

参数2是可选

+0

谢谢拉吉。这很容易 – 2017-07-19 02:26:22

0

撇开SQL注入喜悦,代码会带来的,是的,你可以。您可以设置参数

CREATE PROCEDURE DoStuff @param1 varchar(20) = null 

默认值,则存储过程

IF @param1 IS NOT NULL 
BEGIN 
    ... Do stuff 
END 

在里面你可以设置默认值是你喜欢的东西。

0
CREATE PROCEDURE SQL_INJECTION(
@MandatoryA int, 
@MandatoryB varchar(50), 
@MandatoryC datetime, 
@OptionalA varchar(50) = NULL 
) 
AS 

-- PUT YOUR DYNAMIC SQL HERE 

GO 

要调用

EXEC dbo.SQL_INJECTION @MandatoryA = 1, @MandatoryB = 'test', @MandatoryC = '2009-10-05', @OptionalA = DEFAULT 

注1:动态SQL = SQL注入

+0

“动态SQL = SQL注入”不一定是真的。这取决于您是否使用用户提供的值来构建动态SQL字符串。您可以轻松地在存储过程中基于逻辑构建动态SQL字符串,然后通过参数将用户提供的值传递到动态语句中。OP的代码已经开放给SQL注入,但并非所有的动态SQL都是。 – nicko 2016-02-25 18:55:41