Как выбрать, как заполнить #temptable в sql? - PullRequest
2 голосов
/ 22 апреля 2009

Хорошо, у меня, наверное, очень простой вопрос для вас, Sql-гуру ...

Учитывая некоторый логический тип, T, я хочу заполнить временную таблицу набором данных A, если T - true, или набором данных B, если T - false. Я думал, что это будет, как это сделать:

DECLARE @foo INT
SET @foo = null

IF (@foo is null)
    BEGIN
        SELECT 'foo was null' INTO #TempTable
    END
ELSE
    BEGIN
        SELECT 'foo not null' INTO #TempTable
    END

Но это не работает. Я получаю сообщение об ошибке «В базе данных уже есть объект с именем« #TempTable ».

Видимо, Sql пытается создать таблицу в каждом случае, прежде чем он оценивает условие ...? Это кажется странным для меня, но хорошо ... Но как правильно сделать что-то подобное?

Редактировать: я на Sql Server, но подозреваю, что это более универсальная проблема ... но если я ошибаюсь, пожалуйста, дайте мне знать.

Ответы [ 6 ]

5 голосов
/ 22 апреля 2009

Почему бы не использовать основанное на множестве, а не процедурное решение:

SELECT CASE WHEN @foo is null 
            THEN 'foo was null'
            ELSE 'foo not null'
       END                      AS result
INTO  #TempTable  
4 голосов
/ 22 апреля 2009

SQL сталкивается с этой проблемой, потому что шаг разбора замечает, что есть два оператора SELECT INTO. Даже если ваша логика будет диктовать, что временная таблица будет создана только один раз, синтаксический анализатор по-прежнему жалуется на это.

Один из способов обойти это - использовать операторы GO после SELECT INTO s, но это не будет работать с условной логикой.

В противном случае, просто создайте таблицу отдельно и вставьте в нее так:

CREATE TABLE #TempTable (result varchar(50))

IF @foo is null
BEGIN
   insert into #TempTable values ('foo was null')
END
ELSE
BEGIN
   insert into #TempTable values('foo was not null')
END
4 голосов
/ 22 апреля 2009

Сначала вам нужно будет создать временную таблицу (это нужно сделать один раз):

CREATE TABLE #TempTable TABLE (
        message VARCHAR(50)
)

, затем выдайте:

DECLARE @foo INT
SET @foo = null

IF (@foo is null)
    BEGIN
        INSERT
        INTO    #TempTable
        SELECT 'foo was null'
    END
ELSE
    BEGIN
        INSERT
        INTO    #TempTable
        SELECT 'foo not null'
    END

Возможно, вам нужен не TEMPORARY TABLE, а TABLE VARIABLE (который существует только во время сеанса и не сохраняется в схеме базы данных):

DECLARE @foo INT
DECLARE @TempTable TABLE (
        message VARCHAR(50)
        )
SET @foo = null

IF (@foo is null)
    BEGIN
        INSERT
        INTO    @TempTable
        SELECT 'foo was null'
    END
ELSE
    BEGIN
        INSERT
        INTO    @TempTable
        SELECT 'foo not null'
    END
2 голосов
/ 22 апреля 2009
2 голосов
/ 22 апреля 2009

Таблица уже создана, вам нужно сначала ее удалить, а затем вставить в нее снова.

РЕДАКТИРОВАТЬ: Как вы сказали, проблема не в том, что таблица уже присутствует в базе данных, вы можете попробовать сделать это так -

IF EXISTS (SELECT * FROM sysobjects WHERE object_id = OBJECT_ID(N'#TempTable')
    DROP TABLE #TempTable


CREATE TABLE #TempTable (Col1 INT, ...)

IF TRUE
BEGIN
    INSERT INTO #TempTable
    SELECT VAL1
END
ELSE
BEGIN
    INSERT INTO #TempTable
    SELECT VAL2
END
1 голос
/ 22 апреля 2009

Посмотрите, поможет ли это ... ссылка

Вы должны создать временную таблицу вне ваших операторов выбора а затем вставьте в него. Например,

CREATE TABLE #tmp_table КАК ВЫБРАТЬ * ИЗ ПРОДУКТОВ ГДЕ 1 = 2

IF @condition = 0 НАЧАТЬ INSERT #tmp_table ВЫБРАТЬ * ИЗ продуктов .... КОНЕЦ ELSE ....

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