Ergebnisspaltentypen für gespeicherte Prozeduren abrufen


8

Ich versuche zu ermitteln, was eine gespeicherte Prozedur mit den Spaltennamen und ihren Typen zurückgibt. Ich kann dies mit Tabellen tun, aber ich konnte es für gespeicherte Prozeduren nicht herausfinden. Ich habe das versucht, sp_columnsaber es ist mir nur gelungen, es für Tabellen zum Laufen zu bringen.

Ich habe auch so etwas versucht, bin mir aber nicht sicher, was ich mit was übereinstimmen soll.

SELECT * 
FROM SYS.PROCEDURES (NOLOCK) AS AA
INNER JOIN SYS.SCHEMAS (NOLOCK) AS BB ON (AA.schema_id = BB.schema_id)
INNER JOIN SYS.COLUMNS (NOLOCK) AS CC ON (AA.object_id = CC.object_id)

Zum Beispiel:

USER_ID VARCHAR(200)

Ich brauche nur die Namen der Spaltennamen, die eine gespeicherte Prozedur zurückgibt, und ihre Datentypen. Die SQL Server-Version ist 2014, wenn es darauf ankommt.

Irgendwelche Ideen? Vielen Dank.

Antworten:


13

Speziell für Objekte gibt es eine DMV mit dem Namen sys.dm_exec_describe_first_result_set_for_object, die die erste Ergebnismenge beschreibt, wenn SQL Server herausfinden kann, wie sie aussehen soll (dynamisches SQL gibt beispielsweise kein gültiges Ergebnis zurück).

Speziell für T-SQL- oder Batch-bezogene Elemente gibt es eine andere DMV- und begleitende gespeicherte Systemprozedur. Die DMV ist sys.dm_exec_describe_first_result_set und die gespeicherte Prozedur, die der dmv entspricht, ist sp_describe_first_result_set .



2

Wenn Sie Openquery verwenden, um die Ergebnisse der gespeicherten Prozedur in eine temporäre Tabelle einzufügen, können Sie die Spalten für die temporäre Tabelle abfragen.

Beachten Sie, dass Sie in Openquery keine @ -Variable verwenden können. Sie müssen sie daher über Dynamic SQL und eine Exec ausführen. Das Problem dabei ist nun, dass die temporäre Tabelle außerhalb der dynamischen Abfrage nicht vorhanden ist. Wenn Sie Ihre temporäre Tabelle jedoch in eine globale Abfrage einfügen, können Sie trotzdem darauf zugreifen. Fragen Sie dann einfach die Systemtabellen nach den Spalteninformationen ab, wie Sie es normalerweise tun würden.

    Create PROCEDURE TheProcedure                   
    AS                  
    BEGIN                   
        select 1 id,                
            'textstring' textstring,            
            convert(bit, 'true') boolean            

    END                 
    GO                  

    drop table ##test                   

    declare @query varchar(255)                 
    select @query =             'select * ' 
    select @query = @query +    'into ##test '              
    select @query = @query +    'from Openquery([' + @@SERVERNAME + '], ''exec misdb.dbo.TheProcedure'') '              

    EXEC(@query)                    

    select AC.name columnName,                  
        T.name dataType             
    from tempdb.Sys.columns AC                  
    join tempdb.sys.types T                 
        on AC.system_type_id = T.system_type_id             
    where object_id = object_id('tempdb.dbo.##test')
    order by AC.column_id

/*
columnName  dataType
----------  --------
id          int
textstring  varchar
boolean     bit
*/

2
Dies kann für ältere Versionen von SQL Server nützlich sein, aber für das OP gibt es hier viel Overhead und Gerüste, die sys.dm_exec_describe ... zu einer viel besseren Option machen.
Aaron Bertrand
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.