SQL中如何将exec(@query)的结果插入临时表或普通表?
动态SQL结果插入临时表的解决方法
为什么你的写法会报错
Select * into ##temp from @query执行失败,核心原因是@query是存储SQL语句的字符串变量,SQL Server无法直接从字符串变量中读取数据——它要求FROM子句后面必须是实际的表、视图、子查询这类可查询数据源。
两种可行解决方案
方案1:已知返回结果的表结构时
先手动创建匹配结构的全局临时表,再通过动态SQL把查询结果插入进去:
-- 1. 创建与查询结果结构一致的全局临时表 CREATE TABLE ##temp ( ColumnX VARCHAR(50), -- 替换成实际的数据类型和长度 ColumnY INT -- 替换成实际的数据类型 ) -- 2. 执行动态SQL并插入数据 EXEC('INSERT INTO ##temp ' + @query)
注:如果用局部临时表
#temp,动态SQL执行完成后,外部会话可能无法访问该表,所以这里用全局临时表##temp更稳妥。
方案2:未知返回结果的表结构时
把SELECT INTO的逻辑直接嵌入动态SQL中,让SQL Server自动根据查询结果创建临时表:
-- 动态SQL内完成临时表创建与数据插入 EXEC('SELECT * INTO ##temp FROM (' + @query + ') AS TempResult')
补充:如果
@query是调用存储过程的语句(而非SELECT语句),需要先通过sys.dm_exec_describe_first_result_set获取存储过程的返回结构,提前创建临时表,再执行INSERT INTO ##temp EXEC(@query)完成插入。
内容的提问来源于stack exchange,提问作者user11740857
相关产品推荐
相关产品推荐

