Можно ли записать в ту же временную таблицу с помощью SELECT INTO? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь записать во временную таблицу, исходные данные могут поступать из двух разных источников, но у них одинаковая схема. источник данных выбирается условным оператором IF ELSE может выполняться только один, но sql это, похоже, не нравится. он жалуется, что таблица уже существует. вот фрагмент кода. «Сообщение 2714, уровень 16, состояние 1, процедура sp_xxx, строка 37 [Batch Start Line 0] В базе данных уже есть объект с именем '#my_temp_table'."

IF @flag = 0 
    
    SELECT * INTO #my_temp_table 
    FROM source_A
    
ELSE             
    BEGIN
        --even tho the temp table will not exist i am trying to by pass the error 
        IF OBJECT_ID('tempdb..#my_temp_table ') IS NOT NULL
            DROP TABLE #my_temp_table 

        SELECT * INTO #my_temp_table 
        FROM source_B
    END

1 Ответ

1 голос
/ 06 августа 2020

Здесь происходит пара вещей, которые представляют или будут для вас проблемой.

SQL Сервер SELECT...INTO logi c - это то, как Microsoft решила реализовать более стандартный CREATE TABLE AS... синтаксис (за которым в большинстве диалектов следует оператор SELECT). Вы можете создать эту таблицу только один раз, и тогда она появится.

Локальные временные таблицы (с одним #) продолжают существовать, пока ваш сеанс не отключится от экземпляра. Поэтому, если вы попытаетесь запустить приведенный выше код дважды, не отключаясь, он потерпит неудачу.

Вы используете SELECT *, который вас укусит, когда кто-то изменит схему одной исходной таблицы.

С учетом всего сказанного, вам не нужны все эти c логики. Вы можете делать все, что хотите, одним запросом.

SELECT
  <Column List>
INTO #my_temp_table 
FROM 
  source_A
WHERE @flag = 0
UNION
SELECT
  <Column List>
FROM 
  source_B
WHERE @flag <> 0;
...