Запись 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 ответов
попробуйте # # temp Поскольку динамический запрос выполняется на другом волокне поэтому вы не можете увидеть его локальную таблицу временных тату. вместо этого, если вы объявите свою временную таблицу как глобальную, она сделает sens.
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
другой метод-использовать весь код внутри динамического 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