Результаты динамического запроса во временную таблицу или табличную переменную - PullRequest
2 голосов
/ 23 мая 2011

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

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

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

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 23 мая 2011

В этом посте я нашел решение, которое работает для меня с помощью @SQLMenace Динамические SQL-таблицы T-SQL и временные таблицы

Короче говоря, мне нужно сначала создать таблицу #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
2 голосов
/ 23 мая 2011

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

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

2 голосов
/ 23 мая 2011

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

SELECT *
INTO #MyTempTable
FROM MyResultSet

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...