Использование временных таблиц в операторах IF .. ELSE - PullRequest
5 голосов
/ 03 апреля 2009

Почему SQL Server настаивает на том, что временная таблица уже существует! произойдет одно или другое !! так что никогда не будет так.

declare @checkvar  varchar(10)
declare @tbl TABLE( colx varchar(10) )
set @checkvar ='a'

INSERT  INTO @tbl (colx) VALUES('a')
INSERT  INTO @tbl (colx) VALUES('b')
INSERT  INTO @tbl (colx) VALUES('c')
INSERT  INTO @tbl (colx) VALUES('d')

IF @checkvar  is null  select colx INTO #temp1 FROM @tbl
ELSE select colx INTO #temp1 FROM @tbl WHERE colx =@checkvar

ошибка: в базе данных уже есть объект с именем "# temp1".

Есть ли элегантный способ обойти это? если @checkvar равен нулю, я хочу всю таблицу в противном случае, дайте мне только значения, где @checkvar = что-то

РЕДАКТИРОВАТЬ: столбец varchar, а не int.

Ответы [ 4 ]

6 голосов
/ 18 февраля 2012

Вы можете создать пустую временную таблицу с желаемой структурой, используя WHERE 1=0. Затем вставьте нужные записи с вашим исходным кодом

SELECT colx INTO #temp1 
FROM   @tbl 
WHERE  1 = 0  // this is never true

IF @checkvar  IS NULL
BEGIN 
    INSERT INTO #temp1 (colName)   
    SELECT colx FROM @tbl 
END
ELSE 
BEGIN 
    INSERT INTO #temp1 (colName)   
    SELECT colx 
    FROM   @tbl 
    WHERE  colx = @checkvar 
END
5 голосов
/ 03 апреля 2009

Не могли бы вы просто переписать утверждение?

SELECT colx INTO #temp1 FROM @tbl WHERE (@checkvar IS NULL) OR (colx = @checkVar)
3 голосов
/ 04 апреля 2009

Если это хранимая процедура, SELECT .. INTO вызовет перекомпиляцию процедуры.

Из того, что я понимаю, лучше создать таблицу в верхней части процедуры, а затем сделать обычные INSERT.

Итак, я бы предложил:

CREATE TABLE #temp1 (colx ...)

DECLARE @checkvar  VARCHAR(10)
DECLARE @tbl TABLE( colx varchar(10) )
SET @checkvar ='a'

INSERT  INTO @tbl (colx) VALUES('a')
INSERT  INTO @tbl (colx) VALUES('b')
INSERT  INTO @tbl (colx) VALUES('c')
INSERT  INTO @tbl (colx) VALUES('d')

IF @checkvar IS NULL  
BEGIN
  INSERT INTO #temp1(colx)
  SELECT colx 
  FROM @tbl
END
ELSE 
BEGIN
  INSERT INTO #temp1(colx)
  SELECT colx 
   FROM @tbl WHERE colx =@checkvar
END

Кроме того, таким образом вы избавляетесь от ИЛИ, упомянутого в других решениях (ИЛИ - зло;)

/ B

2 голосов
/ 03 апреля 2009
drop table #temp1

select colx into #temp1 
from @tbl
where (ISNULL(@checkvar,'0')='0' or [colx] = @checkvar )

Если @checkvar существует, он будет использовать этот оператор where, иначе он вернет все данные. Вы можете изменить '0' на что угодно, если только оно никогда не будет начальным значением @ checkvar.

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