带有可选参数的存储过程

时间:2018-05-29 15:05:18

标签: sql-server stored-procedures sql-server-2012 parameter-passing

我有这个程序,我希望能够发送或不发送@sucursal参数

例如:如果我运行它,我应该使用参数9

获取所有值
EXEC Fichada_por_sucursal '2018-05-01','2018-05-05','9'

如果运行这个,我应该得到所有的值,无论什么

EXEC Fichada_por_sucursal '2018-05-01','2018-05-05',''

存储过程:

ALTER PROCEDURE Fichada_por_sucursal 
    (@fecha1 DATE,
     @fecha2 DATE,
     @sucursal INT) 
AS
    SELECT
        CASE DATENAME(dw, a.fecha )
           WHEN 'Monday' then 'Lunes'
           WHEN 'Tuesday ' then 'Martes'
           WHEN 'Wednesday ' then 'Miércoles'
           WHEN 'Thursday' then 'Jueves'
           WHEN 'Friday' then 'Viernes'
           WHEN 'Saturday' then 'Sábado'
           ELSE 'Domingo' 
        END AS Fechadia,
        a.legajo, c.nombres, e.abrv,
        CONVERT(CHAR(10), a.fecha, 103) AS Fecha,
        f.entrada AS Hora_IN,
        a.hora AS ENTRADA,
        f.salida AS Hora_out,
        b.hora AS SALIDA,
        DATEDIFF(HOUR, a.hora, b.hora) AS Horas_trabajadas,
        c.hor_x_jor Horas_jornada,
        DATEDIFF(HOUR, a.hora, b.hora) - hor_x_jor AS Diferencia
    FROM
        fichadas_in a, fichadas_out b, empleados c,
        sucursales d,Clasificacion e, grupo_horario f
    WHERE
        a.Legajo = b.Legajo
        AND a.fecha = b.fecha
        AND a.fecha BETWEEN @fecha1 AND @fecha2
        AND d.codigo = @sucursal
        AND a.legajo = c.legajo
        AND c.CCO = d.Codigo
        AND e.Codigo = c.Clasif
        AND c.grupo_h = f.codigo
    ORDER BY
        a.fecha,legajo

我能这样做吗?

2 个答案:

答案 0 :(得分:1)

当然这很容易。

ALTER PROCEDURE Fichada_por_sucursal 
(
    @fecha1 date,
    @fecha2 date,
    @sucursal int = 0 --or whatever you want as a default date (it could also be NULL.
) 

但是你的代码中还有其他一些坏习惯。首先,你真的应该使用ANSI-92样式连接。他们已经存在了超过25年。 https://sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins

此外,您应该使用含义的别名。 A,B,C都很糟糕。 https://sqlblog.org/2009/10/08/bad-habits-to-kick-using-table-aliases-like-a-b-c-or-t1-t2-t3

答案 1 :(得分:0)

将参数设为可为空(可选)并更改and d.codigo=@sucursal以处理null

ALTER PROCEDURE Fichada_por_sucursal (
    @fecha1 date,
    @fecha2 date,
    @sucursal int = NULL) 

    AS

    select CASE DATENAME(dw, a.fecha )
    WHEN 'Monday' then 'Lunes'
    WHEN 'Tuesday ' then 'Martes'
    WHEN 'Wednesday ' then 'Miércoles'
    WHEN 'Thursday' then 'Jueves'
    WHEN 'Friday' then 'Viernes'
    WHEN 'Saturday' then 'Sábado'
    ELSE 'Domingo' END
    as Fechadia,
    a.legajo,c.nombres,
    e.abrv,CONVERT (char(10), a.fecha, 103) as Fecha,
    f.entrada as Hora_IN,
    a.hora as ENTRADA,
    f.salida as Hora_out,
    b.hora as SALIDA,
    DATEDIFF(HOUR,a.hora,b.hora) as Horas_trabajadas,
    c.hor_x_jor Horas_jornada,
     DATEDIFF(HOUR,a.hora,b.hora) -hor_x_jor as Diferencia

from fichadas_in a, fichadas_out b, empleados c,
    sucursales d,Clasificacion e, grupo_horario f
    where a.Legajo=b.Legajo
    and a.fecha=b.fecha
    and a.fecha between @fecha1 and @fecha2
    and d.codigo=ISNULL(@sucursal, d.codigo)
    and a.legajo=c.legajo
    and c.CCO=d.Codigo
    and e.Codigo=c.Clasif
    and c.grupo_h=f.codigo
    Order by a.fecha,legajo

称之为:

EXEC Fichada_por_sucursal '2018-05-01','2018-05-05','9' 要么 EXEC Fichada_por_sucursal '2018-05-01','2018-05-05'