【问题标题】:Stored procedure with optional parameter带有可选参数的存储过程
【发布时间】:2018-11-08 07:13:03
【问题描述】:

我有这个程序,我希望能够发送或不发送@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

我可以这样做吗?

【问题讨论】:

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


【解决方案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

【讨论】:

  • 它确实有效,参数@sucursal 来自一个不允许空值且没有0 的表,我应该改变我的表吗?
  • 我在上面,谢谢。
  • 那张桌子上有什么?它是您隐式转换为 int 的字符串吗?在这种情况下,您的值将是 0,因为没有空字符串 int 这样的东西。
【解决方案2】:

使参数可以为空(可选)并更改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'

【讨论】:

  • 这项工作非常好,谢谢。
  • 不客气,但我会注意 Sean Lange 的其他建议。
  • 我在上面,谢谢
  • 我可以使用带参数的 ISNULL 语句吗?例如:@Parameter varchar (100) c.Nombres=IsNull(c.Nombres,'') like '%@parameter%' ??
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它
猜你喜欢
  • 2010-10-16
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
相关资源
最近更新 更多