2009-10-05 21 views

Respuesta

7

Proporcionar un valor predeterminado para el parámetro de procedimiento almacenado lo hará opcional.

EDIT:

CREATE PROC [EDURE] [propietario. ]
procedure_name [; número]
[{} @parameter data_type
[VARYING] [= por defecto] [SALIDA]
] [, ... n]

predeterminado

es un valor predeterminado para el parámetro. Si se define un valor predeterminado, se puede ejecutar el procedimiento sin especificar un valor para ese parámetro. El valor predeterminado debe ser una constante o puede ser NULO. Puede incluir caracteres comodín (%, _, [] y [^]) si el procedimiento usa el parámetro con la palabra clave LIKE.

Por favor, vea - http://msdn.microsoft.com/en-us/library/aa258259%28SQL.80%29.aspx

3

Sí. Lista "opcionales" parámetros al final de la lista de parámetros y les dan un valor por defecto (normalmente NULL):

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

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

END 
+0

@ Joel: ¿Es necesario contar con los parámetros opcionales, hacia el final? Creo que es mejor hacerlo desde el punto de vista de la usabilidad. ¿Está bien? – shahkalpesh

+0

No, pero definitivamente es una mejor práctica. –

14

Cuando se crea el procedimiento almacenado, lo crea como esto

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

-- Your code here 

GO 

Param1 se obligatoria

Param2 es opcional

+0

Gracias Raj. Eso fue fácil –

0

Dejando a un lado la alegría de inyección SQL que traerá código, sí se puede. Se puede establecer un valor por defecto para los parámetros

CREATE PROCEDURE DoStuff @param1 varchar(20) = null 

Luego dentro del procedimiento almacenado

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

se puede establecer el valor predeterminado a ser lo que desee.

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

-- PUT YOUR DYNAMIC SQL HERE 

GO 

Para llamar

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

Nota 1: SQL dinámico = Inyección SQL

+0

"Dynamic SQL = SQL Injection" no es necesariamente cierto. Depende de si usa valores proporcionados por el usuario para construir su cadena de SQL dinámico o no. Puede crear fácilmente una cadena SQL dinámica basada únicamente en la lógica dentro del procedimiento almacenado, y luego pasar los valores proporcionados por el usuario a la declaración dinámica a través de parámetros.El código del OP habría estado abierto a la inyección de SQL, pero no a todo el SQL dinámico. – nicko

Cuestiones relacionadas