簡體   English   中英

需要一種編程方式來獲取 SQL Server 內置函數的名稱、參數和返回類型

[英]Need a programatic way to get the names, arguments and return types for SQL Server built-in functions

對於 postgres,可以通過 SQL 查詢獲取內置函數的元數據,例如

SELECT 
    proname as name,
    pg_catalog.pg_get_function_arguments(pg_proc.oid) as input,
    format_type(pg_proc.prorettype, null) as returntype,
    prosrc as definition
FROM pg_proc;

但是對於 SQL Server,我找不到任何這樣的表或函數集。 是否可以?

這應該給你你正在尋找的東西......加上可能有點額外。 ;)

SELECT 
    o.name,
    o.object_id,
    o.type_desc,
    px.parameters,
    returns = ISNULL(rx.returns, 'table'),
    tc.table_cols
FROM
    sys.objects o WITH (NOLOCK)
    CROSS APPLY (
        SELECT parameters = STUFF((
            SELECT 
                CONCAT(', ', p.name, ' ', TYPE_NAME(p.user_type_id), ' ', psl.precision_scale_len)
            FROM
                sys.parameters p WITH (NOLOCK)
                CROSS APPLY ( VALUES (CASE 
                        WHEN p.user_type_id IN (34,35,36,40,48,52,56,58,59,60,61,62,98,99,104,122,127,128,129,130,189,241,256) THEN ''
                        WHEN p.user_type_id IN (106,108) THEN '(' + CONVERT(VARCHAR(10), p.precision) + ',' + CONVERT(VARCHAR(10), p.scale) + ')'
                        WHEN p.user_type_id IN (41,42,43) THEN '(' + CONVERT(VARCHAR(10), p.scale) + ')'
                        WHEN p.user_type_id IN (165,167,173,175) THEN '(' + CASE WHEN p.max_length = -1 THEN 'max' ELSE CONVERT(VARCHAR(10), p.max_length) END + ')'
                        WHEN p.user_type_id IN (231,239) THEN '(' + CASE WHEN p.max_length = -1 THEN 'max' ELSE CONVERT(VARCHAR(10), p.max_length / 2) END + ')'
                    END) ) psl (precision_scale_len)
            WHERE 
                o.object_id = p.object_id
                AND p.is_output = 0
            FOR XML PATH ('')
            ), 1, 2, '')
        ) px (parameters)
    OUTER APPLY (
        SELECT 
            CONCAT(r.name, ' ', TYPE_NAME(r.user_type_id), ' ', psl.precision_scale_len)
        FROM
            sys.parameters r WITH (NOLOCK)
            CROSS APPLY ( VALUES (CASE 
                    WHEN r.user_type_id IN (34,35,36,40,48,52,56,58,59,60,61,62,98,99,104,122,127,128,129,130,189,241,256) THEN ''
                    WHEN r.user_type_id IN (106,108) THEN '(' + CONVERT(VARCHAR(10), r.precision) + ',' + CONVERT(VARCHAR(10), r.scale) + ')'
                    WHEN r.user_type_id IN (41,42,43) THEN '(' + CONVERT(VARCHAR(10), r.scale) + ')'
                    WHEN r.user_type_id IN (165,167,173,175) THEN '(' + CASE WHEN r.max_length = -1 THEN 'max' ELSE CONVERT(VARCHAR(10), r.max_length) END + ')'
                    WHEN r.user_type_id IN (231,239) THEN '(' + CASE WHEN r.max_length = -1 THEN 'max' ELSE CONVERT(VARCHAR(10), r.max_length / 2) END + ')'
                END) ) psl (precision_scale_len)
        WHERE 
            o.object_id = r.object_id
            AND r.is_output = 1
        ) rx ([returns])
    CROSS APPLY (
        SELECT STUFF((
            SELECT 
                CONCAT(', ', c.name, ' ', TYPE_NAME(c.user_type_id), ' ', psl.precision_scale_len)
            FROM
                sys.columns c WITH (NOLOCK)
            CROSS APPLY ( VALUES (CASE 
                    WHEN c.user_type_id IN (34,35,36,40,48,52,56,58,59,60,61,62,98,99,104,122,127,128,129,130,189,241,256) THEN ''
                    WHEN c.user_type_id IN (106,108) THEN '(' + CONVERT(VARCHAR(10), c.precision) + ',' + CONVERT(VARCHAR(10), c.scale) + ')'
                    WHEN c.user_type_id IN (41,42,43) THEN '(' + CONVERT(VARCHAR(10), c.scale) + ')'
                    WHEN c.user_type_id IN (165,167,173,175) THEN '(' + CASE WHEN c.max_length = -1 THEN 'max' ELSE CONVERT(VARCHAR(10), c.max_length) END + ')'
                    WHEN c.user_type_id IN (231,239) THEN '(' + CASE WHEN c.max_length = -1 THEN 'max' ELSE CONVERT(VARCHAR(10), c.max_length / 2) END + ')'
                END) ) psl (precision_scale_len)
            WHERE 
                o.object_id = c.object_id
            FOR XML PATH('')), 1, 2, '')
            ) tc (table_cols)
WHERE 
    o.type IN ('AF','FN','FS','FT','IF');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM