7

考虑以下代码:

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

显然这是因为 exec 命令分离了一个单独的会话,而 #temp 是该会话的本地。我可以使用全局临时表##temp,但是我必须想出一个命名方案以避免冲突。大家有什么推荐的?

4

8 回答 8

6

您是否尝试显式创建模板表?

Create Table #temp (..)
于 2009-03-27T01:19:16.220 回答
6

试试##temp 因为你的动态查询是在另一个纤程上执行的,所以你看不到它的本地临时表。相反,如果您将临时表声明为 global,则它是有意义的。

于 2009-09-17T19:19:33.600 回答
2

您可以在 exec 之前创建 temp 并使用 exec 填充临时表。

于 2009-03-27T01:20:59.663 回答
2

没有找到一个可行的解决方案来完成我需要的一切,所以我改用##global 临时表。

于 2009-03-31T18:04:57.440 回答
1

举个例子,看“成”

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
于 2010-04-05T15:46:05.810 回答
0

你能不能把你的选择放在插入后用 ; 分隔符并同时运行这两个语句?

于 2009-03-27T01:59:48.183 回答
0

另一种方法是使用动态 SQL 中的所有代码

SET @SQL1 = 'SELECT * INTO #temp WHERE ...
SELECT * from #temp  ' 
exec(@SQL1) 
于 2010-06-08T07:56:55.300 回答
0

有一种方法可以创建具有单个标识列的虚拟临时表,然后通过动态 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
于 2015-07-29T10:57:56.513 回答