插入记录前的测试条件 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...ELSE
或 CASE
表达式:
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)。
我在 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...ELSE
或 CASE
表达式:
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)。