У меня есть динамическая хранимая процедура, которая возвращает набор результатов.
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 Я получаю недопустимое имя объекта, когда пытаюсь получить доступ к временной таблице.
Это потому, что это выходит за рамки, вероятно. См. stackoverflow.com/questions/3887989/… вам нужно переосмыслить свое решение. Вы можете просто передать реальное имя таблицы и удалить его, когда закончите.
Это потому, что временная таблица не существует, когда вы пытаетесь создать SP. Вместо этого я бы предложил создать постоянную промежуточную таблицу, которую вы просто усекаете каждый раз перед обработкой.
2 проблемы с созданием постоянной/временной таблицы в вызывающей процедуре 1) Я не знаю структуру таблицы заранее, я буду продолжать изменять 2) Существует проблема 2 вызовов, обновляющих одну и ту же таблицу одновременно
Создайте переменную с именем @tablename = 'sometable_' + replace(cast(newid() as sysname), '-', '_') передайте ее вместо ##table. Таким образом, это будет работать, и вы получите довольно уникальное имя таблицы.
Ваша хранимая процедура никогда не создавала временную таблицу, которую вы намеревались создать, а просто выбирает записи из 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 большое спасибо за наблюдение и совет. С наилучшими пожеланиями.
Что тебя останавливает? Вы получаете ошибку? Лично я бы создал обычную временную таблицу снаружи и заполнил ее внутри