无法修改存储过程,如何将其查询结果直接存入临时表?
实现方法
在不修改存储过程、不手动定义临时表结构、不使用表值参数的前提下,有两种可靠的方式实现需求:
方式一:利用OPENROWSET自动生成临时表
这种方式和SELECT ... INTO的逻辑一致,会自动匹配存储过程返回的字段结构和数据类型,但需要先启用Ad Hoc分布式查询配置(仅需执行一次,需管理员权限):
-- 启用高级配置和Ad Hoc分布式查询 sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
之后执行以下语句即可将存储过程结果导入临时表:
SELECT * INTO #TEMPTABLE FROM OPENROWSET( 'SQLNCLI', 'Server=你的服务器实例;Trusted_Connection=yes;', -- 替换为实际连接信息 'EXEC 你的数据库名.dbo.sp_MyStoredProcedure' -- 替换为存储过程的完整名称 ) AS ResultSet;
方式二:通过系统视图自动生成表结构(无需额外配置权限)
如果没有权限修改服务器配置,可以利用sys.dm_exec_describe_first_result_set系统视图自动获取存储过程的返回结果结构,动态创建临时表后再插入数据:
DECLARE @CreateTableSQL NVARCHAR(MAX); -- 生成创建临时表的SQL语句 SELECT @CreateTableSQL = 'CREATE TABLE #TEMPTABLE (' + STRING_AGG(QUOTENAME(name) + ' ' + system_type_name, ', ') + ')' FROM sys.dm_exec_describe_first_result_set( N'EXEC 你的数据库名.dbo.sp_MyStoredProcedure', -- 替换为存储过程完整名称 NULL, 0 ); -- 执行创建临时表的动态SQL EXEC sp_executesql @CreateTableSQL; -- 将存储过程结果插入临时表 INSERT INTO #TEMPTABLE EXEC 你的数据库名.dbo.sp_MyStoredProcedure;
注意:第二种方式要求存储过程的返回结果集结构是确定的(即每次执行返回的字段数量、类型固定),如果存储过程存在分支返回不同结构的结果集,sys.dm_exec_describe_first_result_set可能无法准确获取结构。
内容的提问来源于stack exchange,提问作者Dmitriy Ryabin
相关产品推荐
相关产品推荐

