SQL Serverを扱う場合、次のようなものを何度も書く必要があります。
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')
または、ループバックリンクサーバーを設定して、代わりに使用することもできます。
EXEC sp_addlinkedserver @server = 'LOCALSERVER', @srvproduct = '',
@provider = 'SQLNCLI', @datasrc = @@servername
SELECT *
INTO #T
FROM OPENQUERY(LOCALSERVER,
'SET FMTONLY OFF;
EXEC sp_who')
SQL Server 2012以降では、 sys.dm_exec_describe_first_result_set
ローカルで、次の結果セットがfirst結果であると想定します。
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を使用しなかった理由です。 :-)
いいえ。ストアドプロシージャの結果は大きく異なる可能性があります。あるオブジェクトに対するSELECTのように、常に1つの結果セットを返すようには設計されていません。
あなたする必要がある CREATE TABLEを実行する
テーブルを生成するプロシージャを作成します。
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を任意のテーブル名に置き換えます。
上記は次のようなものを生成します:
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
);