插入记录前的测试条件 SQL 服务器

Testing condition before inserting records SQL server

我在 SQL 服务器中有一个存储过程,用于将实际支出的记录插入 table。当调用该过程时,相关月份被指定为变量的一部分。例如:

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 语句似乎效率低下。有更好的方法吗?

我同意 Larnu 的观点...但是如果在这两种情况下都使用全局温度 table( 或真实的 tables)...类似:

declare @column varchar(64) = 
                            case 
                                when @month = 1 then '[jan_amt]'
                                when @month = 2 then '[feb_amt]'
                                ...
                            end

create table ##actuals_b (...your table definition...)

    declare @sql varchar(max) = '
       INSERT INTO ##actuals_b
               ([forecast_yr_id]
               ,[entry_type]
               ,[unit_cd]
               ,[proj_nbr]
               ,' + @column = ') select * from ##actuals'

print(@sql)

这假设 ##actuals 只有一个 amt 列,这似乎是基于其他月份的静态值的情况。

为了扩展我的评论,您 table 的正确设计应该是:

--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)
                        ...)

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

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;

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