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

рассмотрим следующий код:

SET @SQL1 = 'SELECT * INTO #temp WHERE ...'
exec(@SQL1)
SELECT * from #temp  (this line throws an error that #temp doesn't exist)

по-видимому, это связано с тем, что команда exec запускает отдельный сеанс, а #temp является локальным для этого сеанса. Я могу использовать глобальную временную таблицу ##temp, но тогда мне нужно придумать схему именования, чтобы избежать конфликтов. Что вы все рекомендуете?

9 ответов


пытались ли вы явно создать таблицу шаблонов?

Create Table #temp (..)

попробуйте # # temp Поскольку динамический запрос выполняется на другом волокне поэтому вы не можете увидеть его локальную таблицу временных тату. вместо этого, если вы объявите свою временную таблицу как глобальную, она сделает sens.


вы можете создать temp перед exec и использовать exec для заполнения таблицы temp.


Alternativley, вы можете использовать табличную переменную.

вот хороший статьи, чтобы обсудить это.


не нашел работоспособного решения,которое сделало все, что мне нужно, поэтому я переключился на использование ##глобальных временных таблиц.


пример, посмотрите на "into"

SELECT o.OrderID, o.OrderDate, od.UnitPrice, od.Quantity,
       c.CustomerID, c.CompanyName, c.Address, c.City, c.Region,
       c.PostalCode, c.Country, c.Phone, p.ProductID,
       p.ProductName, p.UnitsInStock, p.UnitsOnOrder
INTO   #temp
FROM   Orders o
JOIN   [Order Details] od ON o.OrderID = od.OrderID
JOIN   Customers c ON o.CustomerID = c.CustomerID
JOIN   Products p ON p.ProductID = od.ProductID

не можете ли вы поместить свой выбор после вставки в с; delimeter и запустить два оператора вместе?


другой метод-использовать весь код внутри динамического SQL

SET @SQL1 = 'SELECT * INTO #temp WHERE ...
SELECT * from #temp  ' 
exec(@SQL1) 

существует метод создания пустышка временная таблица с одним столбцом идентификатора, а затем изменение этой таблицы с требуемой схемой через динамический SQL и ее заполнение. Таким образом, вы можете использовать временную таблицу в динамике и обычный SQL, присоединяйтесь к нему...

-- Create dummy table
CREATE TABLE #tmpContactData (PK int NOT NULL IDENTITY(1,1))

-- Alter its schema
DECLARE @sqlCommand nvarchar(max)
SELECT @sqlCommand = '
ALTER TABLE #tmpContactData
ADD 
    EmployeeId int,
    Address varchar(100),
    Phone varchar(50)
'
EXECUTE(@sqlCommand)

-- Fill it
SELECT @sqlCommand = '
INSERT INTO #tmpContactData
SELECT t.EmployeeId, t.Address, t.Phone 
FROM (  SELECT EmployeeId=1000, Address=''Address 1000'', Phone=''Phone 1000'' 
        UNION 
        SELECT 1001, ''Address 1001'', ''Phone 1001'' 
        UNION 
        SELECT 1002, ''Address 1002'', ''Phone 1002''
) t
'
EXECUTE(@sqlCommand)

--select from it
SELECT * FROM #tmpContactData

--CleanUp
DROP TABLE #tmpContactData