如何动态创建和填充本地临时表(当表头未知时)?

时间:2018-11-01 16:46:07

标签: sql sql-server tsql

我当前正在使用类似于以下代码:

SET @Query = 'SELECT * INTO #Temp FROM MyTable'
EXEC sp_executesql @Query

显然,这不起作用。到目前为止,我一直在动态sql中使用全局临时表来解决此问题。但是,一旦将存储过程发布给用户,这将不是一种选择,因为他们的全局临时表会相互冲突。

如何解决这个问题?我必须指定表MyTable的结构是未知的,因此在动态sql之外创建临时表不是(可能吗?)。

编辑:如果我对我要达到的目标不够具体,我深表歉意-我认为最好让这个问题尽可能地与实际问题保持联系。

很明显,我要执行的字符串不是固定的。而是构造它,以便可以指定从中检索数据的表。尽管仍然不太复杂,但我使用的实际查询字符串更像

@Query = CONCAT('SELECT * INTO #Temp FROM ', @Environment, '.[schema].', @Table)

希望这可以进一步阐明这个问题?

2 个答案:

答案 0 :(得分:0)

几点: 1.如果要将动态SQL的输出存储到临时表中,则需要首先创建临时表结构(使用CREATE TABLE #TEMP脚本),然后可以通过执行以下操作来插入数据:

INSERT INTO #TEMP EXEC sp_executesql @Query

这将使用本地临时表的所有属性将数据填充到临时表中。

  1. 看到您的查询,除非您动态地形成诸如where子句之类的子句,否则似乎并不需要动态sql。

让我知道这是否有帮助。

答案 1 :(得分:0)

你不能做这样的事情:

declare @query nvarchar(4000) = '
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[temp]'') AND type in (N''U''))
begin 
       drop table temp
end

Select top 2 * 
into temp 
from sys.databases
'
exec sp_executesql @query

Select * from temp

使用Select into,您无需知道查询的结构: https://www.w3schools.com/sql/sql_select_into.asp

只是一个想法。