SQL IF ELSE вставить в проблему #temp таблицы - PullRequest
0 голосов
/ 08 мая 2019

У меня есть сценарий, который я не знаю, как решить. Ниже у меня есть оператор if else и вставка данных во временную таблицу.

IF @code= 'All'
    BEGIN
        DROP TABLE IF EXISTS #temp
        SELECT * 
        INTO #temp
        FROM #tempCity
    END
ELSE
    BEGIN
        DROP TABLE IF EXISTS #temp
        SELECT * 
        INTO #temp
        FROM #tempCity
        WHERE [City_Code] = @code
    END

Стоит отметить, что мне нужно, чтобы таблица #temp имела одинаковое имя в обоих условиях, так как я буду использовать его позже, и то, что может быть вставлено, может отличаться от случая к случаю, поэтому я не определил #temp.

Я получаю сообщение об ошибке, которое понятно в этом случае:

There is already an object named '#temp' in the database.

Кто-нибудь знает, как я могу решить эту тонкую проблему?

Ответы [ 3 ]

3 голосов
/ 08 мая 2019

Почему бы просто не использовать логическую логику:

IF EXISTS (SELECT 1 FROM #temp)
   DROP TABLE #temp

SELECT * 
INTO #temp
FROM #tempCity
WHERE (@code= 'All' OR [City_Code] = @code);
0 голосов
/ 08 мая 2019

Это на самом деле ошибка компилятора. Если вы попробуете что-то вроде этого:

DROP TABLE #test;
GO

DECLARE @Code int;

IF @Code IS NULL BEGIN

    CREATE TABLE #test (ID int);
END ELSE BEGIN

    CREATE TABLE #test (ID int);
END

GO
DROP TABLE #test;

Предполагая, что #test никогда не существовало, вы получите ошибки:

Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '#test', because it does not exist or you do not have permission.
Msg 2714, Level 16, State 1, Line 11
There is already an object named '#test' in the database.
Msg 3701, Level 11, State 5, Line 15
Cannot drop the table '#test', because it does not exist or you do not have permission.

Это фактически показывает, что #test никогда не создавался. Это потому, что вы пытаетесь создать #test дважды в одном выражении, а компилятору это не нравится.

Вам, вероятно, лучше использовать WHERE, как это в результате:

SELECT *
INTO #Temp
FROM #TempCity
WHERE City_Code = @Code OR @Code = 'All;

Хотя вы можете использовать динамический SQL, временный объект будет сохраняться только в сеансе, созданном sp_executesql; делая это бесполезным для вас.

0 голосов
/ 08 мая 2019

Во-первых, вы, вероятно, можете обойтись без IF:

SELECT * 
INTO #temp
FROM #tempCity
WHERE @code = 'All' OR [City_Code] = @code;

Во-вторых, проблема заключается в ошибке компиляции времени.То есть SELECT INTO не работает, потому что таблица существует.Вы можете использовать GO для решения этой проблемы:

DROP TABLE IF EXISTS #temp;
GO

SELECT * 
INTO #temp
FROM #tempCity
WHERE @code = 'All' OR [City_Code] = @code;

Но это не будет работать в хранимой процедуре, функции или триггере.Другой вариант - использовать динамический SQL:

DROP TABLE IF EXISTS #temp;

EXEC '
SELECT * 
INTO #temp
FROM #tempCity
WHERE @code = ''All'' OR [City_Code] = @code
';

Но я думаю, что лучшим решением будет использование табличной переменной.Они будут удалены, когда выходят за рамки.Это означает, что вы можете объявить их и предположить, что они не существуют.Затем используйте INSERT для добавления данных.

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