Результаты динамического запроса во временную таблицу или табличную переменную

У меня есть хранимая процедура, которая использует sp_executesql для генерации набора результатов, количество столбцов в результате может варьироваться, но будет в форме Col1, Col2, Col3 и т. Д.

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

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

Есть идеи?

3 ответа

Решение

В этом посте я нашел решение, которое работает для меня с помощью @SQLMenace. T-SQL Dynamic SQL и Temp Tables

Короче говоря, мне нужно сначала создать таблицу #temp в обычном SQL, а затем я могу изменить структуру, используя дополнительные динамические операторы SQL. В этом примере @colcount установлен на 6. Это будет определяться другим хранимым процессом, когда я реализую это.

IF object_id('tempdb..#myTemp') IS NOT NULL
DROP TABLE #myTemp

CREATE TABLE #myTemp (id int IDENTITY(1,1) )
DECLARE @cmd nvarchar(max)
DECLARE @colcount int
SET @colcount = 6
DECLARE @counter int
SET @counter = 0
WHILE @counter < @colcount
    BEGIN
      SET @counter = @counter + 1
      SET @cmd = 'ALTER TABLE #myTemp  ADD col' + CAST(@counter AS varchar(4)) + ' NVARCHAR(MAX)'
      EXEC(@cmd)
    END

INSERT INTO #myTemp 
EXEC myProc @param1, @param2, @param3

SELECT * FROM #myTemp

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

Просто убедитесь, что вычистили их, когда закончите...:)

Есть ли причина, по которой вы не можете сделать что-то вроде:

SELECT *
INTO #MyTempTable
FROM MyResultSet

SELECT INTO не требует явного списка полей.

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