Вставка SQL в временную таблицу без указания значений? - PullRequest
1 голос
/ 13 мая 2011

У меня есть хранимая процедура, которая в настоящее время использует один CTE. Этот работает так:

WITH MY_CTE AS
(
    // Logic here uses SELECT * from a single table.
)
SELECT *
INTO #Tasks
FROM MY_CTE;

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

IF @Option = 1
    BEGIN
        INSERT INTO #Tasks
        (
            WITH MY_OTHER_CTE
            (
                // Logic here uses SELECT * from same table as first CTE.
            )
            SELECT *
            FROM MY_OTHER_CTE
        )
    END

Проблема в том, что для вызова INSERT INTO #Tasks необходимо указать VALUES столбцы. Обе CTE возвращают записи из одной таблицы. Хорошим преимуществом оригинальной хранимой процедуры было то, что она работала бы, даже если столбцы в этой таблице изменились, поскольку я использовал SELECT *. Я мог бы указать столбцы, зная, что они находятся в общей таблице, но я потерял это преимущество (что в данном конкретном случае является чрезвычайно полезным преимуществом). Есть ли способ выполнить то, что я пытаюсь сделать, зная, что они оба выбирают из одной таблицы и что столбцы всегда будут совпадать?

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

Работает ли это?

;WITH MY_OTHER_CTE AS
(
    // Logic here uses SELECT * from same table as first CTE.
)
INSERT INTO #Tasks
    SELECT *
    FROM MY_OTHER_CTE

Может возникнуть другая проблема, если выбранная вами таблица (и, следовательно, временная таблица) имеет столбец идентификаторов

2 голосов
/ 13 мая 2011

Я начну с обязательного «перечисление ваших столбцов - хорошая практика по 6 354 причинам».Но мы все были там, где вы не можете; -)

В любом случае, я бы решил это с помощью производных таблиц и союзов.Ключевым моментом здесь является выполнение серии UNION и использование критериев WHERE для отбрасывания запросов, которые вы не хотите выполнять.Очевидно, что все таблицы должны иметь одинаковые типы данных в одном и том же порядке, чтобы это работало, но код может выглядеть примерно так ...запрос "два CTE", но я подозреваю, что это приведет вас в то же место.

...