Nhận loại cột kết quả thủ tục lưu trữ


8

Tôi đang cố gắng lấy bất cứ thứ gì một thủ tục được lưu trữ trả về, với tên cột và kiểu của chúng. Tôi có thể làm điều này với các bảng nhưng tôi không thể tìm ra nó cho các thủ tục được lưu trữ. Tôi đã thử sp_columnsnhưng chỉ quản lý để làm cho nó hoạt động cho các bảng.

Tôi cũng đã thử một cái gì đó như thế này nhưng tôi không chắc mình sẽ hợp với cái gì.

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)

Ví dụ:

USER_ID VARCHAR(200)

Tôi chỉ cần tên của các cột tên một thủ tục được lưu trữ trả về và kiểu dữ liệu của chúng. Phiên bản SQL Server là 2014, nếu có vấn đề.

Có ý kiến ​​gì không? Cảm ơn.

Câu trả lời:


13

Cụ thể cho các đối tượng, có một DMV được gọi là sys.dm_exec_describe_first_result_set_for_object sẽ mô tả tập kết quả đầu tiên nếu SQL Server có thể tìm ra nó sẽ là gì (ví dụ SQL động sẽ không trả về kết quả hợp lệ).

Cụ thể đối với T-SQL hoặc các mục liên quan đến lô có DMV khác nhau và quy trình lưu trữ hệ thống đi kèm. DMV là sys.dm_exec_describe_first_result_set và thủ tục được lưu trữ tương đương với dmv là sp_describe_first_result_set .



2

Nếu bạn sử dụng Openquery để chèn kết quả của thủ tục được lưu trữ vào bảng tạm thời, bạn có thể truy vấn các cột cho bảng tạm thời.

Lưu ý, bạn không thể sử dụng @variable trong Openquery, vì vậy bạn sẽ cần chạy nó thông qua sql động và một exec. Vấn đề với bây giờ là bảng tạm thời không tồn tại bên ngoài truy vấn động. Nhưng, nếu bạn đặt bảng tạm thời của bạn vào một truy vấn toàn cầu, bạn vẫn có thể truy cập nó. Sau đó, chỉ cần truy vấn các bảng hệ thống cho thông tin cột như bình thường.

    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
Điều này có thể hữu ích cho các phiên bản SQL Server cũ hơn, nhưng đối với OP, có rất nhiều chi phí và giàn giáo ở đây làm cho sys.dm_exec_describe ... một lựa chọn tốt hơn nhiều.
Aaron Bertrand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.