Динамические результаты запроса в таблицу temp или табличную переменную
У меня есть хранимая процедура, которая использует sp_executesql для генерации набора результатов, количество столбцов в результате может меняться, но будет в форме Col1 Col2 Col3 и т. Д.
Мне нужно получить результат в таблице temp или table, чтобы я мог работать с ним. Проблема в том, что мне нужно определить столбцы таблицы temp, которые я не могу выполнять динамически с помощью sp_executesql, поскольку область таблицы temp теряется после выполнения команды.
Я играл с идеей использования таблиц Global Temp, так как область позволяет создавать динамически, однако есть очень хорошие шансы, что глобальные Temps будут обновляться при одновременном выполнении этого процесса.
- Найти имена столбцов таблицы Temp
- Использование временных таблиц с тем же именем в хранимой процедуре
- Динамически создайте временную таблицу, вставьте в временную таблицу, а затем выберите
- Как использовать временную таблицу SQL Server #tblTmpYaks в Microsoft Access VBA?
- Получение данных из базы данных MSSQL с временной таблицей по JAVA
Есть идеи?
- Может ли кто-нибудь дать мне пример в реальном времени с приведенной ниже таблицей temp и табличным примером, который я нашел в stackexchange
- Когда следует использовать переменную таблицы vs временную таблицу в sql-сервере?
- Как я могу заполнять временные таблицы, фильтровать их, а затем циклически (SQL Server)?
- Azure SQL Data Warehouse - медленный LEFT JOIN с временной таблицей
- В чем разница между таблицей temp и табличной переменной в SQL Server?
- Отображение параметров с помощью выполнения SQL-задачи
- Почему временные таблицы быстрее, чем переменные таблицы для соединений?
- В чем разница между TEMPORARY TABLE и TABLE VARIABLE в SQL 2008?
Я нашел решение, которое работает для меня с помощью @SQLMenace в этом столбце T-SQL Dynamic SQL и Temp Tables
Короче говоря, мне нужно сначала создать таблицу #temp в стандартном SQL, затем я могу изменить структуру, используя дальнейшие динамические операторы SQL. В этом примере @colcount устанавливается в 6. Это будет определено другим сохраненным proc, когда я его реализую.
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
Вы можете использовать глобальные таблицы temp, имена которых «уникальны» по SPID процесса создания. Это может позволить вам не топать на других глобальных временных таблицах, созданных другими соединениями.
Просто убедитесь, что очистите их, когда закончите … 🙂
Есть ли причина, по которой вы не можете сделать что-то вроде:
SELECT * INTO #MyTempTable FROM MyResultSet
SELECT INTO
не требует явного списка полей.