2010-09-19 6 views

risposta

13

A meno che non siate pronti a analizzare il contenuto di ROUTINE_DEFINITION in INFORMATION_SCHEMA.ROUTINES, la soluzione migliore è eseguire le procedure e leggere le informazioni della colonna dai record restituiti.

In .NET è possibile eseguire questa operazione leggendo i risultati della stored procedure in un DataTable e interrogando la proprietà Columns.

Il motivo per cui non esiste un modo semplice per eseguire questa operazione è che una stored procedure potrebbe potenzialmente restituire set di risultati diversi in base ai parametri. Non esiste un formato di set di risultati fisso come se esistesse con funzioni definite dall'utente.

Modifica

Come accennato in altra risposta, è necessario utilizzare SET FMTONLY ON per garantire l'assenza di dati viene restituito. Esistono alcune situazioni in cui SET FMTONLY non funzionerà, ad es. quando si utilizzano le tabelle #temp nelle stored procedure, ma c'è un workaround.

+0

Per SQL2012, seguire i consigli in questo post: http://stackoverflow.com/a/14575114/569662 –

+0

Se Microsoft attacca al deprecando DataTable in .NET core, questo metodo cesserà di funzionare se ci si sposta a nucleo. –

9

Ho appena eseguito Profiler per vedere come Visual Studio esegue questa operazione per il trascinamento della selezione del dataset fortemente tipizzato.

Questo è il codice che ha inviato.

SET NO_BROWSETABLE ON; 
SET FMTONLY ON; 

exec dbo.aspnet_Roles_GetAllRoles @ApplicationName=NULL 

Quindi presumo che non ci possa essere un modo "più ufficiale" di farlo.

Ovviamente è necessario tenere presente che una singola stored procedure potrebbe restituire più set di risultati o set di risultati diversi in base ai parametri passati.

Per le persone in 2012+ un altro approccio potrebbe essere quello di utilizzare sp_describe_first_result_set

1

Il mio modo di fare questo: Modificare la stored procedure di avere una clausola INTO:

Change

Select * from tablename 

a

Select * INTO _tablename FROM tablename 

Questo crea un tabella nel database. Quindi, utilizzare SELECT * FROM INFORMATION_SCHEMA WHERE TABLE_NAME = '_tablename'

Non dimenticare di annullare la modifica al comando sproc.

Problemi correlati