Stored procedure & metadata
Può capitare la necessità di conoscere, a runtime, lo schema (i metadati) del resultset uscente da una stored procedure.
Recuperare queste informazioni può essere utile, ad esempio, in tutti quegli scenari in cui lo schema varia al variare del codice (magari perchè dinamicamente si vanno a generare, sulla base di parametri e/o dati, set differenti).
Prima di SQL Server 2012non era semplicissimo risolvere questa problematica.
Adesso, tramite la stored procedure sp_describe_first_result_set, diventa una banalità:
EXEC sp_describe_first_result_set
@tsql = N'exec [AdventureWorks2012].[dbo].[uspGetEmployeeManagers] 1';
Per le versioni precedenti di SQL Server la soluzione era leggermente più complessa (con la necessità, tra le altre cose, ti utilizzare il comando OPENROWSET e di attivare la configurazione di “Ad Hoc Distributed Queries”):
/*
EXEC sp_configure 'show advanced options' , 1;
RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries' , 1;
RECONFIGURE;
GO
*/
IF OBJECT_ID( N'tempdb..#t', N'U' )IS NOT NULL
BEGIN
DROP TABLE #t;
END;
/* please type your server... */
SELECT P.* INTO #t
FROM OPENROWSET
(
'SQLNCLI' ,
'Server=.\SQL2012;Trusted_Connection=yes;' ,
'exec [AdventureWorks2012].[dbo].[uspGetEmployeeManagers] 1'
) AS P
WHERE 1 = 0;
SELECT c.name as [column name],
(
SELECT t.name
FROM sys.types t
WHERE
t.user_type_id = c.system_type_id AND
is_user_defined = 0
) AS [column type] ,
c.max_length
FROM tempdb.sys.columns c
WHERE object_id = OBJECT_ID( N'tempdb..#t' , N'U' );