Как сделать условный INSERT INTO из разных таблиц? - PullRequest
0 голосов
/ 20 января 2019

Я пишу хранимую процедуру для выполнения некоторых общих проверок, в хранимой процедуре у меня есть код, подобный следующему, чтобы избежать создания слишком большого числа @variables:

IF type = 'spl' 
THEN BEGIN
    SELECT col1, col4, col5, col9, col20, ... INTO #tmp
    FROM tbl1 
    WHERE primary_key = unique_id
END
ELSE BEGIN
    SELECT col1, col5, col7, col8, col19, ... INTO #tmp
    FROM tbl2
    WHERE primary_key = unique_id
END

Хотя эти два INSERT могутникогда не запускается одновременно, это все равно вызывает ошибку #tmp table already exist, и хранимая процедура не может быть создана.

Есть ли какой-нибудь общий способ для этого?

Следующее, безусловно, возможно, но выглядит хуже, чем объявление десятков @variables.Но это единственное, что я могу придумать, атм.

SELECT * 
INTO #TEMP 
FROM 
     (SELECT 
          CASE WHEN type = 'spl' 
                  THEN a.col1 
                  ELSE b.col1 
               END, 
   ...
   FROM ... CROSS JOIN ... 
)

1 Ответ

0 голосов
/ 21 января 2019

Вы можете выполнить «условную» вставку из нескольких источников данных, комбинируя их с union all и имея отдельные предложения where, которые приведут к тому, что только один источник данных будет создавать строки:

insert into #tmp
  select col1, col2, ...
    from tbl1
    where @type = 'spl' and primary_key = unique_id
  union all
  select col1, col2, ...
    from tbl2
    where @type <> 'spl' and primary_key = unique_id;

Еслиесли вы хотите создать выходную таблицу, вы можете использовать select ... into ... с предложением where, которое запрещает вставку каких-либо строк.Результатом будет пустая таблица с правильной схемой:

-- Create empty   #tmp   table.
select col1, col2, ...
  from tbl1
  into #tmp
  where 42 = 6 * 9; -- Answer to the Ultimate Question of Life, the Universe, and Everything.

Обратите внимание, что выполнение отдельных запросов с использованием if / then позволяет оптимизатору запросов генерировать оптимальные планы для каждый запрос, а не целое union all сбивает с толку, и это делает намерение более ясным для долгосрочного обслуживания.

Это также может быть хорошим временем для чтения сниффинга параметра .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...