TSQL从动态SQL写入临时表

时间:2009-03-27 01:16:34

标签: sql-server tsql session temp-tables

请考虑以下代码:

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 个答案:

答案 0 :(得分:6)

您是否尝试明确创建模板表?

Create Table #temp (..)

答案 1 :(得分:5)

尝试## temp 因为您的动态查询是在其他光纤上执行的 所以你看不到它的本地临时表。 相反,如果你宣布你的临时表像全球一样,它会产生一种感觉。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分: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

答案 5 :(得分:0)

插入之后你不能把你的选择放入;分隔并将两个语句一起运行?

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

有一种方法可以创建带有单个标识列的虚拟临时表,然后通过动态SQL使用所需的模式更改该表并填充它。这样你就可以在动态和常规 SQL中使用临时表,与它一起加入......

BorderPane