Результаты динамического запроса во временную таблицу или табличную переменную
У меня есть хранимая процедура, которая использует 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
не требует явного списка полей.