随笔 - 57,  文章 - 0,  评论 - 25,  阅读 - 26624

首先我很讨厌写存储过程,其次我很讨厌

没办法,主要是需要进行 行转列,项目经理说可以用Pivot。我不是很精通sql,但是我会百度呀~

pivot需要有确定的列名。那我这个项目里面没办法确定,最后问了gpt,使用动态sql(我以前也没用过),不过效果是我想要的,于是乎,改成存储过程吧。

简单的存储过程不难,其实以前我也会写,只是很久很久……似乎我工作之后就没用过,差不多就忘了……

小小总结一下

  1. 创建存储过程  
    CREATE PROC(PROCEDURE ) FactoryCalendar
    //create 创建  
    //proc(procedure是全称,proc就行)存储过程  
    //FactoryCalendar 你的存过过程名字
  2. 可以传参或者不传参
    CREATE PROCEDURE FactoryCalendar
        @MD001 NVARCHAR(50)
    AS
    //定义的变量呢需要加@ 然后加个类型,代表参数类型
    //AS关键字主要在于将参数和存储过程主体分开,as下面你就知道存储过程开始了
  3. 接下来就是你要执行的sql了。一般begin开始end结尾。不多废话了。写个案例就知道了
复制代码
-- 创建存储过程,获取资源组工作日历
CREATE PROCEDURE FactoryCalendar
    @MD001 NVARCHAR(50)
AS
BEGIN
    DECLARE @Columns AS NVARCHAR(MAX)
    DECLARE @SQL AS NVARCHAR(MAX)

    -- 使用动态SQL生成资源名称的列名
    SELECT @Columns = STRING_AGG(QUOTENAME(资源名称), ', ') WITHIN GROUP (ORDER BY 资源名称)
    FROM (
        SELECT DISTINCT MB.MB002 AS 资源名称
        FROM BW_CMSMD CMD
        INNER JOIN BW_MPSMB MB ON CMD.MD003 = MB.MB003
        INNER JOIN BW_MPSMD MD ON MB.MB001 = MD.MD001
        WHERE CMD.MD001 = @MD001
    ) AS ColName;
    print @Columns;
    -- 构建动态SQL查询
    SET @SQL = '
    SELECT *
    FROM (
        SELECT 
            MB.MB002 AS 资源名称, 
            CMD.MD001 AS 部门编号, 
            CMD.MD002 AS 部门名称, 
            MD.MD002 AS 日期, 
            MD.MD003 AS 当日产能
        FROM BW_CMSMD CMD
        INNER JOIN BW_MPSMB MB ON CMD.MD003 = MB.MB003
        INNER JOIN BW_MPSMD MD ON MB.MB001 = MD.MD001
        WHERE CMD.MD001 = ''' + @MD001 + '''
    ) AS SourceData
    PIVOT (
        MAX(当日产能)
        FOR 资源名称 IN (' + @Columns + ')
    ) AS PivotedData;'

    -- 执行动态SQL查询
    EXEC(@SQL);
END
复制代码

  4.执行存储过程 :有参数就这么写,没有直接 exec FactoryCalendar 

exec FactoryCalendar   '6875'

 

posted on   尝尝手指  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示