sql-server - 插入记录前的测试条件 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 语句似乎效率低下。有一个更好的方法吗?
解决方案
为了扩展我的评论,你的桌子的正确设计应该是这样的:
--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...ELSE
orCASE
表达式,而是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)。
推荐阅读
- javascript - 在达到像素宽度后阻止 Textarea 输入
- javascript - 快捷键不起作用 ctrl + shift + numpad1
- c++ - 使用友元函数重载的 C++ 运算符。尝试添加多个对象失败
- javascript - 使用 lodash 对对象进行分组
- xamarin.forms - Microsoft Azure 存储数据移动库以及 xamarin 表单
- ios - 回到 UIViewController 不会触发 segue
- c# - 我可以帮助 C# 编译器推断这种类型吗?
- c - 如何在 CLion 中设置断点条件
- javascript - 更改 js 函数参数的引用
- sql - 如何不重复使用 SQL where 子句