动态查询结果为临时表或表变量

时间:2011-05-23 16:45:53

标签: sql-server dynamic-sql temp-tables table-variable sp-executesql

我有一个使用sp_executesql生成结果集的存储过程,结果中的列数可能会有所不同,但格式为Col1 Col2 Col3等。

我需要将结果放入临时表或表变量中,以便我可以使用它。问题是我需要定义临时表的列,我不能使用sp_executesql动态执行,因为在执行命令后临时表的作用域会丢失。

我已经玩弄了使用全局临时表的想法,因为范围允许它动态创建,但是,这个过程的并发执行很有可能全局临时更新。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

在这篇文章T-SQL Dynamic SQL and Temp Tables

中,我找到了一个适用于@SQLMenace帮助的解决方案

简而言之,我需要先在普通的SQL中创建一个#temp表,然后我可以使用更多的动态SQL语句来改变结构。在这个例子中,@colcount设置为6.当我实现它时,这将由另一个存储过程确定。

IF object_id('tempdb..#myTemp') IS NOT NULL
DROP TABLE #myTemp

CREATE TABLE #myTemp (id int IDENTITY(1,1) )
DECLARE @cmd nvarchar(max)
DECLARE @colcount int
SET @colcount = 6
DECLARE @counter int
SET @counter = 0
WHILE @counter < @colcount
    BEGIN
      SET @counter = @counter + 1
      SET @cmd = 'ALTER TABLE #myTemp  ADD col' + CAST(@counter AS varchar(4)) + ' NVARCHAR(MAX)'
      EXEC(@cmd)
    END

INSERT INTO #myTemp 
EXEC myProc @param1, @param2, @param3

SELECT * FROM #myTemp

答案 1 :(得分:2)

你有什么理由不能这样做:

SELECT *
INTO #MyTempTable
FROM MyResultSet

SELECT INTO不需要显式字段列表。

答案 2 :(得分:2)

您可以使用创建过程的SPID名称为“unquified”的全局临时表。这可以让您避免踩踏其他连接创建的其他全局临时表。

确保在完成后清理它们......:)