首页 > 解决方案 > 插入记录前的测试条件 SQL server

问题描述

我在 SQL Server 中有一个存储过程,可将实际费用的记录插入表中。当调用该过程时,所讨论的月份被指定为变量的一部分。例如:

exec dbo.upsert_actuals_load_01_load_data 4

当代码运行时,它应该将记录插入到对应于月份的列中。'1' 将值插入 jan_amt,'2' 将值插入 feb_amt 等。

我写了这段代码:

IF @month = 1
   INSERT INTO #actuals_b
           ([forecast_yr_id]
           ,[entry_type]
           ,[unit_cd]
           ,[proj_nbr]
           ,[jan_amt]
           ,[feb_amt]
           ,[mar_amt]
           ...])
     SELECT forecast_yr_id
          , entry_type
          , unit_cd
          , proj_nbr
          , month_amt AS jan_amt
          , 0 AS feb_amt
          , 0 AS mar_amt
          ....
       FROM #actuals;

必须为每个 IF @month = 条件编写 INSERT INTO 语句似乎效率低下。有一个更好的方法吗?

标签: sql-serverif-statementconditional

解决方案


为了扩展我的评论,你的桌子的正确设计应该是这样的:

--All data types are complete guesses
CREATE TABLE actuals_b ([forecast_yr_id] int,
                        [entry_type] varchar(10),
                        [unit_cd] varchar(10),
                        [proj_nbr] int,
                        MonthNum int,
                        Amount decimal(12,2)
                        ...)

然后,您的表达式不再是IF...ELSEorCASE表达式,而是INSERT变得更简单:

INSERT INTO actuals_b([forecast_yr_id],[entry_type],[unit_cd],[proj_nbr],MonthNum,Amount,...)
SELECT forecast_yr_id,
       entry_type,
       unit_cd,
       proj_nbr,
       @month,
       month_amt,
       ...
FROM actuals;

(注意这是在没有完整表定义的情况下的伪 SQL)。


推荐阅读