我当前正在使用类似于以下代码:
SET @Query = 'SELECT * INTO #Temp FROM MyTable'
EXEC sp_executesql @Query
显然,这不起作用。到目前为止,我一直在动态sql中使用全局临时表来解决此问题。但是,一旦将存储过程发布给用户,这将不是一种选择,因为他们的全局临时表会相互冲突。
如何解决这个问题?我必须指定表MyTable
的结构是未知的,因此在动态sql之外创建临时表不是(可能吗?)。
编辑:如果我对我要达到的目标不够具体,我深表歉意-我认为最好让这个问题尽可能地与实际问题保持联系。
很明显,我要执行的字符串不是固定的。而是构造它,以便可以指定从中检索数据的表。尽管仍然不太复杂,但我使用的实际查询字符串更像
@Query = CONCAT('SELECT * INTO #Temp FROM ', @Environment, '.[schema].', @Table)
希望这可以进一步阐明这个问题?
答案 0 :(得分:0)
几点: 1.如果要将动态SQL的输出存储到临时表中,则需要首先创建临时表结构(使用CREATE TABLE #TEMP脚本),然后可以通过执行以下操作来插入数据:
INSERT INTO #TEMP EXEC sp_executesql @Query
这将使用本地临时表的所有属性将数据填充到临时表中。
让我知道这是否有帮助。
答案 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
只是一个想法。