Удаление временных таблиц в хранимой процедуре-оболочке (SQL APS/PDW)

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

Процедура не завершается, так как существуют временные таблицы с одинаковыми именами в разных хранимых процедурах в процедуре-оболочке.

Мне нужно найти способ удалить все временные таблицы между хранимыми процедурами внутри оболочки.

Or

Имейте общую команду для удаления всех временных таблиц в конце каждой хранимой процедуры, находящейся в оболочке.

Среда — Microsoft SQL APS (PDW).


person Emile Santino    schedule 15.11.2016    source источник
comment
Ваши временные таблицы действительно начинаются с # или ##? Или у вас есть настоящие таблицы, которые вы называете временными таблицами. Если у вас есть временные таблицы с ограниченной областью действия, начинающиеся с #, этой проблемы возникнуть не должно, поскольку они удаляются, когда процедура выходит за пределы области действия. Также укажите текст сообщения об ошибке.   -  person HLGEM    schedule 15.11.2016


Ответы (3)


Это должно дать вам список временных таблиц. Когда у вас есть список, вы можете выбрать то, что вы создаете, и удалить их одну за другой, используя динамический sql.

select * from tempdb.sys.objects where type='U'
person vamsi    schedule 15.11.2016

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

If Object_ID('tempdb..#yourTempTable') Is Not Null 
    Drop Table #yourTempTable

Или для создания команд отбрасывания вы можете использовать это:

 Select 'Drop table tempdb..' + Name From tempdb.sys.objects where type = 'U' and is_ms_shipped = 0
person Neo    schedule 15.11.2016

Вы неверно истолковали свои сообщения об ошибках, какими бы они ни были. Я сделал следующее. Обратите внимание, что sp1 и sp2 создают таблицу с именем #t1.

ALTER PROCEDURE [dbo].[sp1] 
AS
BEGIN
    SET NOCOUNT ON;
    create table #t1(id integer);
    insert into #t1
    SELECT 1 record;

    select id from #t1;
END

ALTER PROCEDURE [dbo].[sp2]

AS
BEGIN
    SET NOCOUNT ON;

    create table #t1(id integer);
    insert into #t1
    SELECT 2 record;

    select id from #t1;
END
GO

alter PROCEDURE sp3

AS
BEGIN
    SET NOCOUNT ON;     
    declare @t1 as table (id integer);

    insert into @t1
    exec sp1;
    insert into @t1
    exec sp2;

    select id from @t1;
END
GO

А теперь большое испытание. Этот

exec sp3

возвращает две строки со значениями 1 и 2.

person Dan Bracuk    schedule 15.11.2016