удаление и повторное использование временной таблицы в сохраненной процедуре - PullRequest
4 голосов
/ 06 июня 2010

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

так, как я могу удалить таблицу в хранимой процедуре и создать ее заново? возможно ли это без использования временной таблицы?

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

WHILE @offset<@NumDays BEGIN
    SELECT 
    bg.*, j.ID, j.time, j.Status
    INTO #TEMP1
    FROM #TEMP2 AS bg
    left outer join PersonSchedule j on bg.PersonID = j.PersonID and
    j.TimeSlotDateTime = @StartDate + @offset

    DROP TABLE #TEMP2;
    SELECT * INTO #TEMP2 FROM #TEMP1 
    DROP TABLE #TEMP1

    SET @offset = @offset + 1
END

Ответы [ 3 ]

1 голос
/ 06 июня 2010

Что нужно сделать с временной таблицей?

Один из вариантов - использовать переменную таблицы, а не временную таблицу.

Или вы можете попробовать использовать Общие табличные выражения , например:

  WHILE @offset<@NumDays  
   BEGIN
        WITH tmp1 AS (SELECT 
        bg.*, j.ID, j.time, j.Status
        FROM #TEMP2 AS bg
        left outer join PersonSchedule j on bg.PersonID = j.PersonID and
        bg.TimeSlotDateTime = j.TimeSlotDateTime and
        j.TimeSlotDateTime = @StartDate + @offset
    )

SELECT * FROM tmp1 

    SET @offset = @offset + 1
END
1 голос
/ 02 мая 2015

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

В примере OP, хотя он сделал DROP TABLE, он также сделал 2 отдельных SELECT для команд. В то время как предлагаемое решение сделал только 1 SELECT INTO (в цикле). Процедура OP не удалась при компиляции. Компилятор видел две попытки создать одну и ту же таблицу, в то время как в предлагаемом решении компилятор видел только 1 попытку создать таблицу, поэтому он позволил создать процедуру.

1 голос
/ 06 июня 2010

В SQL Server 2008 вам разрешено удалять и повторно создавать таблицы в цикле в хранимой процедуре:

create procedure CreateTablesInALoop
as
declare @i int
set @i = 0
while @i < 100
    begin
    select 1 as id into #t
    drop table #t
    set @i = @i + 1
    print 'Yay'
    end
go
exec CreateTablesInALoop
go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...