You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何声明带参数的存储过程?现有存储过程参数化改造咨询

没问题,我来帮你把这个存储过程改成接收UserID和Month参数的版本,同时还会优化一下逻辑让它更灵活好用~

修改后的完整代码

ALTER PROCEDURE [dbo].[SP_TaskObjDashboard] 
    @UserID INT = NULL, -- 允许不传参数,默认返回所有活跃用户
    @Month INT = NULL   -- 允许不传参数,默认使用当前月份
AS 
BEGIN 
    -- 移除原来硬编码的变量声明,改用输入参数
    SELECT 
        COALESCE(@UserID, users.UserID) AS TC, 
        Objtask.Pace, 
        Objtask.Month, 
        salesobj.SalesObjectiveMonth 
    FROM TBL_User AS users 
    JOIN TBL_Objectives_Task AS Objtask ON users.UserID = Objtask.Consultant 
    LEFT JOIN TBL_SalesObjective AS salesobj ON users.UserID = salesobj.UserID 
    WHERE 
        users.IsActive = 1 
        -- 处理月份参数:传了就用指定月份,没传就用当前月份
        AND MONTH(Objtask.Month) = COALESCE(@Month, MONTH(GETDATE()))
        -- 处理UserID参数:传了就过滤指定用户,没传就返回所有活跃用户
        AND users.UserID = COALESCE(@UserID, users.UserID) 
END

关键改动说明

  • 参数化改造:把原来硬编码的@UserID和固定日期的月份值,改成了存储过程的输入参数@UserID和@Month,并且给参数设置了默认值,让调用更灵活。
  • 逻辑优化:
    • 月份判断用COALESCE(@Month, MONTH(GETDATE())),如果不传@Month就自动用当前月份,不用每次硬改日期。
    • 保留了你原来的COALESCE(@UserID, users.UserID)逻辑,支持不传@UserID时返回所有活跃用户的数据。
  • 移除冗余代码:删掉了原来没用到的DECLARE @Dateinput变量,让代码更简洁。

调用示例

你可以根据需求灵活调用:

  • 查看用户ID=20在8月份的数据:
    EXEC [dbo].[SP_TaskObjDashboard] @UserID = 20, @Month = 8
    
  • 查看所有活跃用户当前月份的数据:
    EXEC [dbo].[SP_TaskObjDashboard]
    
  • 查看所有活跃用户在10月份的数据:
    EXEC [dbo].[SP_TaskObjDashboard] @Month = 10
    

内容的提问来源于stack exchange,提问作者PNSCal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:38:49