在 SQL Server 中创建可以保存存储过程结果的临时表的最简单方法是什么?

Jus*_*ner 53 sql-server stored-procedures t-sql

很多时候我在处理 SQL Server 时需要编写如下内容。

create table #table_name
(
    column1 int,
    column2 varchar(200)
    ...
)

insert into #table_name
execute some_stored_procedure;
Run Code Online (Sandbox Code Playgroud)

但是,创建一个具有作为存储过程结果的精确语法的表是一项繁琐的任务。例如,sp_helppublication的结果有 48 列!我想知道是否有任何简单的方法可以做到这一点。

谢谢。

Mar*_*ith 40

如果过程只返回一个结果集并且启用了即席分布式查询选项。

SELECT * 
INTO #T 
FROM OPENROWSET('SQLNCLI', 
                'Server=(local)\MSSQL2008;Trusted_Connection=yes;',
                 'SET FMTONLY OFF;EXEC sp_who')
Run Code Online (Sandbox Code Playgroud)

或者您可以设置一个环回链接服务器并使用它。

EXEC sp_addlinkedserver @server = 'LOCALSERVER',  @srvproduct = '',
                        @provider = 'SQLNCLI', @datasrc = @@servername

SELECT *
INTO  #T
FROM OPENQUERY(LOCALSERVER, 
               'SET FMTONLY OFF;
               EXEC sp_who')
Run Code Online (Sandbox Code Playgroud)


Aar*_*and 21

在 SQL Server 2012 及更高版本中,您可以sys.dm_exec_describe_first_result_set在本地使用,假设您所追求的结果集是第一个结果:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += ',' + CHAR(13) + CHAR(10) + CHAR(9)
    + name + ' ' + system_type_name
    FROM sys.dm_exec_describe_first_result_set('sp_who', NULL, 1);

SELECT @sql = N'CREATE TABLE #f
(' + STUFF(@sql, 1, 1, N'') + '
);';

PRINT @sql;
Run Code Online (Sandbox Code Playgroud)

结果:

CREATE TABLE #f
(
    spid smallint,
    ecid smallint,
    status nchar(30),
    loginame nvarchar(128),
    hostname nchar(128),
    blk char(5),
    dbname nvarchar(128),
    cmd nchar(16),
    request_id int
);
Run Code Online (Sandbox Code Playgroud)

请注意,有一个限制:如果您的存储过程创建 #temp 表,则元数据功能不起作用。这就是我没有使用 sp_who2 的原因。:-)