create table #table_name
(
column1 int,
column2 varchar(200)
...
)
insert into #table_name
execute some_stored_procedure;
但是创建一个表,该表具有与存储过程相同的语法:一项繁琐的任务。例如,sp_helppublication的结果有48列!我想知道是否有任何简便的方法。
谢谢。
#1 楼
如果该过程仅返回一个结果集,并且启用了临时分布式查询选项。SELECT *
INTO #T
FROM OPENROWSET('SQLNCLI',
'Server=(local)\MSSQL2008;Trusted_Connection=yes;',
'SET FMTONLY OFF;EXEC sp_who')
或者您可以设置回送链接服务器并使用它。 br />
EXEC sp_addlinkedserver @server = 'LOCALSERVER', @srvproduct = '',
@provider = 'SQLNCLI', @datasrc = @@servername
SELECT *
INTO #T
FROM OPENQUERY(LOCALSERVER,
'SET FMTONLY OFF;
EXEC sp_who')
#2 楼
在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;
结果:
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
);
注意有一个限制:如果您的存储过程创建了#temp表,则元数据功能不起作用。这就是为什么我不使用sp_who2的原因。 :-)
#3 楼
否。存储过程的结果可能千差万别:它并非总是像一个SELECT一样总是返回一个结果集。必须执行CREATE TABLE
#4 楼
我会编写一个为我生成表的过程:CREATE PROCEDURE [dbo].[p_create_table_from_procedure]
@TABLE_NAME AS NVARCHAR(MAX),
@PROCEDURE_NAME AS NVARCHAR(MAX)
As
DECLARE @CREATE_TABLE_QUERY NVARCHAR(MAX) = N'';
SELECT
@CREATE_TABLE_QUERY += ', ' + name + ' ' + UPPER(system_type_name) + CHAR(13) + CHAR(10) + CHAR(9)
FROM
sys.dm_exec_describe_first_result_set(@procedure_name, NULL, 1);
SELECT
@CREATE_TABLE_QUERY = N'CREATE TABLE ' + @table_name + '(' + CHAR(13) + CHAR(10) + CHAR(9) + STUFF(@CREATE_TABLE_QUERY, 1, 1, N'') + ');';
PRINT @CREATE_TABLE_QUERY;
,然后用以下代码调用它:
EXEC p_create_table_from_procedure 'YOUR_TABLE_NAME_HERE', 'YOUR_PROCEDURE_NAME_HERE'
注意:将“ YOUR_PROCEDURE_NAME_HERE”替换为您自己的存储过程的名称。
注意:将YOUR_TABLE_NAME_HERE替换为您选择的表名。
以上内容将生成类似this:
CREATE TABLE YOUR_TABLE_NAME_HERE(
WeekName VARCHAR(40)
, Line Name VARCHAR(50)
, TheDate DATETIME
, ReceivedAll INT
, Answered INT
, Abandoned INT
, Call Length INT
, WaitTimeAnswer INT
, WaitTimeAbandon INT
, PeriodName VARCHAR(10)
, Week SMALLINT
, Period SMALLINT
, Year SMALLINT
, WeekInPeriod SMALLINT
, NumWeeksInPeriod SMALLINT
, WeekendDate DATETIME
, CRCOperative VARCHAR(100)
, CallType VARCHAR(20)
, Charge Time INT
, SourceNumber VARCHAR(80)
, DestinationNumber VARCHAR(80)
, CallStart DATETIME
, Out of Hours VARCHAR(12)
, IsWorkingDay BIT
);
评论
这与@AaronBertrand的上述答案有何不同?
– Max Vernon♦
15年8月5日在4:03
评论
您不是要SET FMT_ONLY ON吗?
– AndreasÅgren
2012年2月13日上午10:01
@Andreas-否,因为我以为是从存储过程输出中创建并填充表。
–马丁·史密斯
2012年2月13日在10:15