考虑以下代码:
SET @SQL1 = 'SELECT * INTO #temp WHERE ...'
exec(@SQL1)
SELECT * from #temp (this line throws an error that #temp doesn't exist)
显然这是因为 exec 命令分离了一个单独的会话,而 #temp 是该会话的本地。我可以使用全局临时表##temp,但是我必须想出一个命名方案以避免冲突。大家有什么推荐的?
考虑以下代码:
SET @SQL1 = 'SELECT * INTO #temp WHERE ...'
exec(@SQL1)
SELECT * from #temp (this line throws an error that #temp doesn't exist)
显然这是因为 exec 命令分离了一个单独的会话,而 #temp 是该会话的本地。我可以使用全局临时表##temp,但是我必须想出一个命名方案以避免冲突。大家有什么推荐的?
您是否尝试显式创建模板表?
Create Table #temp (..)
试试##temp 因为你的动态查询是在另一个纤程上执行的,所以你看不到它的本地临时表。相反,如果您将临时表声明为 global,则它是有意义的。
您可以在 exec 之前创建 temp 并使用 exec 填充临时表。
没有找到一个可行的解决方案来完成我需要的一切,所以我改用##global 临时表。
举个例子,看“成”
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