C'è un modo tramite i metadati (Information_Schema, forse?) Per ottenere un elenco delle colonne restituite da un sproc? Sto cercando di automatizzare la generazione di codice e questo sarebbe di grande aiuto ...Ottieni i nomi/tipi di colonna restituiti da una stored procedure
risposta
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.
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
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.
- 1. Come si eliminano i risultati da una stored procedure da una stored procedure?
- 2. Come chiamare una stored procedure da un'altra stored procedure?
- 3. Interrogare i risultati di una stored procedure
- 4. Chiamare una stored procedure in una stored procedure in MySQL
- 5. Utilizzare SQL per filtrare i risultati di una stored procedure
- 6. DocumentDB chiamata stored procedure da un'altra stored procedure o stessa
- 7. Ritorno XML da una stored procedure Oracle
- 8. Esecuzione di stored procedure da un DbContext
- 9. chiama stored procedure da solr
- 10. Come chiamare una stored procedure (con parametri) da un'altra stored procedure senza tabella temporanea
- 11. Come pianificare una stored procedure?
- 12. Stored procedure restituisce una stringa?
- 13. Restituzione di più valori da una stored procedure
- 14. C#: passando dataTable di stored procedure: colonna problema ordine
- 15. l'esecuzione di una stored procedure Oracle da SQL Server 2008
- 16. Stored procedure vs nessuna stored procedure - Security Viewpoint
- 17. Usa database all'interno di una stored procedure
- 18. Come restituire una tabella da una stored procedure?
- 19. Perché non è possibile utilizzare l'istruzione INSERT EXEC all'interno di una stored procedure richiamata da un'altra stored procedure?
- 20. Stored procedure arretrato a POJO da iBATIS
- 21. Come eseguire Stored procedure da Laravel
- 22. Ottenere i nomi dei campi da stored procedure con Dapper
- 23. Salvati rotto stored procedure
- 24. stored procedure e aggiornamento EDMX
- 25. come popolare un DataTable da una stored procedure
- 26. Chiamata di stored procedure SSIS
- 27. stored procedure restituisce VarChar
- 28. Come passare i parametri alla stored procedure da Entity Framework?
- 29. Chiamare la stored procedure Oracle da C#?
- 30. Calling DocumentDb stored procedure da .net
Per SQL2012, seguire i consigli in questo post: http://stackoverflow.com/a/14575114/569662 –
Se Microsoft attacca al deprecando DataTable in .NET core, questo metodo cesserà di funzionare se ci si sposta a nucleo. –