Проверка состояния перед вставкой записей SQL-сервером - PullRequest
0 голосов
/ 14 мая 2018

У меня есть хранимая процедура в 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;

Кажется неэффективным писать оператор INSERT INTOдля каждого условия IF @month =.Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Чтобы расширить мой комментарий, правильный дизайн вашей таблицы должен выглядеть примерно так:

--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 или CASE ваш 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 при отсутствии полного определения таблицы).

0 голосов
/ 14 мая 2018

Я согласен с Ларну здесь ... но вы могли бы построить это динамически, если бы вы использовали глобальную временную таблицу в обоих случаях ( или реальные таблицы ) ... что-то вроде:

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)

Предполагается, что ## facts имеет только один столбец amt, что, как представляется, основано на ваших статических значениях за другие месяцы.

...