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

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

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

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

Ответы [ 8 ]

6 голосов
/ 27 марта 2009

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

Create Table #temp (..)
5 голосов
/ 17 сентября 2009

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

2 голосов
/ 31 марта 2009

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

2 голосов
/ 27 марта 2009

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

1 голос
/ 05 апреля 2010

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

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
0 голосов
/ 29 июля 2015

Существует метод создания временной таблицы dummy с одним столбцом идентификаторов, затем изменение этой таблицы с требуемой схемой посредством динамического 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
0 голосов
/ 08 июня 2010

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

SET @SQL1 = 'SELECT * INTO #temp WHERE ...
SELECT * from #temp  ' 
exec(@SQL1) 
0 голосов
/ 27 марта 2009

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

...