如何让存储过程Fichada_por_sucursal支持可选参数@sucursal?
当然可以实现!
要让@sucursal参数支持可选传入,我们只需要调整参数定义和查询的过滤条件就能满足你的需求,下面是具体的修改方案:
步骤1:调整参数定义
原存储过程中@sucursal是INT类型且不允许空值,我们需要将其改为允许空值并设置默认值为NULL,这样当不传入该参数或者传入空值时,就会返回所有分店的数据。如果要兼容你示例中传入空字符串''的场景,也可以将参数类型改为VARCHAR(10)(不过更推荐用NULL作为“所有分店”的标识,避免类型转换的潜在报错)。
步骤2:修改WHERE过滤逻辑
原查询里d.codigo = @sucursal是强制过滤分店的,我们需要改成当@sucursal有有效值时过滤,否则忽略该条件,用OR逻辑实现这个需求:(@sucursal IS NULL OR d.codigo = @sucursal)。
修改后的完整存储过程代码
ALTER PROCEDURE Fichada_por_sucursal @fecha1 DATE, @fecha2 DATE, @sucursal INT = NULL -- 设置默认值为NULL,支持可选传入 AS BEGIN 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 JOIN fichadas_out b ON a.Legajo = b.Legajo AND a.fecha = b.fecha JOIN empleados c ON a.legajo = c.legajo JOIN sucursales d ON c.CCO = d.Codigo JOIN Clasificacion e ON e.Codigo = c.Clasif JOIN grupo_horario f ON c.grupo_h = f.codigo WHERE a.fecha BETWEEN @fecha1 AND @fecha2 AND (@sucursal IS NULL OR d.codigo = @sucursal) -- 关键的条件修改 ORDER BY a.fecha, legajo END
测试执行
- 查询分店编号为9的数据:
EXEC Fichada_por_sucursal '2018-05-01','2018-05-05',9 - 查询所有分店的数据(两种方式都可行):
-- 方式1:传入NULL EXEC Fichada_por_sucursal '2018-05-01','2018-05-05',NULL -- 方式2:利用默认值,直接省略该参数 EXEC Fichada_por_sucursal '2018-05-01','2018-05-05'
如果一定要兼容你示例中传入空字符串''的情况,可以把参数类型改为VARCHAR(10),然后修改条件为:
@fecha1 DATE, @fecha2 DATE, @sucursal VARCHAR(10) = '' -- 改为VARCHAR类型,默认空字符串 -- ... AND (ISNULL(@sucursal, '') = '' OR d.codigo = CAST(@sucursal AS INT))
不过这种方式需要注意空字符串转整数的异常情况(比如传入非数字字符串会报错),所以更推荐用NULL的方案。
内容的提问来源于stack exchange,提问作者user9768237
相关产品推荐
相关产品推荐

