How do I return the SQL data types from my query?

前端 未结 13 1464
耶瑟儿~
耶瑟儿~ 2021-01-29 23:58

I\'ve a SQL query that queries an enormous (as in, hundreds of views/tables with hard-to-read names like CMM-CPP-FAP-ADD) database that I don\'t need nor want to understand. Th

13条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-01-30 00:29

    There MUST be en easier way to do this... Low and behold, there is...!

    "sp_describe_first_result_set" is your friend!

    Now I do realise the question was asked specifically for SQL Server 2000, but I was looking for a similar solution for later versions and discovered some native support in SQL to achieve this.

    In SQL Server 2012 onwards cf. "sp_describe_first_result_set" - Link to BOL

    I had already implemented a solution using a technique similar to @Trisped's above and ripped it out to implement the native SQL Server implementation.

    In case you're not on SQL Server 2012 or Azure SQL Database yet, here's the stored proc I created for pre-2012 era databases:

    CREATE PROCEDURE [fn].[GetQueryResultMetadata] 
        @queryText VARCHAR(MAX)
    AS
    BEGIN
    
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        --SET NOCOUNT ON;
    
        PRINT @queryText;
    
        DECLARE
                    @sqlToExec NVARCHAR(MAX) = 
                        'SELECT TOP 1 * INTO #QueryMetadata FROM ('
                        +
                        @queryText
                        +
                        ') T;'
                        + '
                            SELECT
                                        C.Name                          [ColumnName],
                                        TP.Name                         [ColumnType],
                                        C.max_length                    [MaxLength],
                                        C.[precision]                   [Precision],
                                        C.[scale]                       [Scale],
                                        C.[is_nullable]                 IsNullable
                            FROM
                                        tempdb.sys.columns              C
                                            INNER JOIN
                                        tempdb.sys.types                TP
                                                                                    ON
                                                                                            TP.system_type_id = C.system_type_id
                                                                                                AND
                                                                                            -- exclude custom types
                                                                                            TP.system_type_id = TP.user_type_id
                            WHERE
                                        [object_id] = OBJECT_ID(N''tempdb..#QueryMetadata'');
                '
    
        EXEC sp_executesql @sqlToExec
    
    END
    

提交回复
热议问题