2

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

我需要将结果放入临时表或表变量中,以便我可以使用它。问题是我需要定义临时表的列,我无法使用 sp_executesql 动态地执行此操作,因为在执行命令后临时表的范围丢失了。

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

有任何想法吗?

4

3 回答 3

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
于 2011-05-23T17:30:52.377 回答
2

有什么理由你不能做类似的事情:

SELECT *
INTO #MyTempTable
FROM MyResultSet

SELECT INTO不需要明确的字段列表。

于 2011-05-23T16:50:10.370 回答
2

您可以使用全局临时表,其名称由创建进程的 SPID “唯一”。这可以让您避免踩踏由其他连接创建的其他全局临时表。

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

于 2011-05-23T16:51:17.077 回答