我有这个程序,我希望能够发送或不发送@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
我能这样做吗?
答案 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'