Как создать глобальную временную таблицу в одной хранимой процедуре и использовать ее в другой хранимой процедуре

У меня есть динамическая хранимая процедура, которая возвращает набор результатов.

CREATE OR ALTER PROCEDURE [test].[proc] 
    (@id INT,
     @temp_table_name VARCHAR(50) = '') 
AS
BEGIN
    SET @sql = N'SELECT * FROM test.table con';

    IF (LEFT(@temp_table_name, 2) = '##')
    BEGIN
        DECLARE @move_to_temp_sql varchar(max);

        SET @move_to_temp_sql = REPLACE(@sql, 'FROM test.table con', 'INTO ' + @temp_table_name + ' FROM test.table con');
    END

    EXECUTE(@sql)
END

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

[test].[proc] 1, '##test'

Я хотел бы получить доступ к глобальной временной таблице ##test из вызывающей хранимой процедуры следующим образом:

SELECT * FROM ##test;

я получил

Недопустимое имя объекта '##test'

когда я попробую это.

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

Что тебя останавливает? Вы получаете ошибку? Лично я бы создал обычную временную таблицу снаружи и заполнил ее внутри

siggemannen 19.04.2023 21:19

@siggemannen Я получаю недопустимое имя объекта, когда пытаюсь получить доступ к временной таблице.

Siddharth Dinesh 19.04.2023 21:29

Это потому, что это выходит за рамки, вероятно. См. stackoverflow.com/questions/3887989/… вам нужно переосмыслить свое решение. Вы можете просто передать реальное имя таблицы и удалить его, когда закончите.

siggemannen 19.04.2023 21:31

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

Brad 19.04.2023 21:31

2 проблемы с созданием постоянной/временной таблицы в вызывающей процедуре 1) Я не знаю структуру таблицы заранее, я буду продолжать изменять 2) Существует проблема 2 вызовов, обновляющих одну и ту же таблицу одновременно

Siddharth Dinesh 19.04.2023 21:33

Создайте переменную с именем @tablename = 'sometable_' + replace(cast(newid() as sysname), '-', '_') передайте ее вместо ##table. Таким образом, это будет работать, и вы получите довольно уникальное имя таблицы.

siggemannen 19.04.2023 21:37
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
6
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

вместо EXECUTE(@sql) нужно использовать EXECUTE(@move_to_temp_sql).

Также вам нужно объявить переменную @sql в вашей хранимой процедуре. Пожалуйста, попробуйте это. Вы получите желаемую временную таблицу.

Вы также можете просто

CREATE OR ALTER PROCEDURE [proc] 
    (@id INT,
     @temp_table_name VARCHAR(50) = '') 
AS
BEGIN  
    DECLARE @sql varchar(max);        

    IF (LEFT(@temp_table_name, 2) = '##')
    BEGIN

        SET @sql = 'select * INTO ' + QUOTENAME(@temp_table_name) + ' FROM test.table con';
    END

    EXECUTE(@sql)
END

Логика объявления и установки @sql внутри IF, а затем его последующего выполнения ускользает от меня. Совет: при сборке имен объектов в динамические операторы SQL лучше всего использовать QuoteName(), чтобы избежать проблем с нечетными именами, например. New Table с пробелом или зарезервированными словами, например From.

HABO 20.04.2023 05:21

@HABO большое спасибо за наблюдение и совет. С наилучшими пожеланиями.

Kazi Mohammad Ali Nur Romel 20.04.2023 07:08

Другие вопросы по теме