简体   繁体   English

需要一种编程方式来获取 SQL Server 内置函数的名称、参数和返回类型

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

For postgres it is possible to obtain metadata for built-in functions via SQL queries like对于 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;

However for SQL Server, I cannot find any such set of tables or functions.但是对于 SQL Server,我找不到任何这样的表或函数集。 Is it possible?是否可以?

This should give you what you're looking for... Plus maybe a little extra.这应该给你你正在寻找的东西......加上可能有点额外。 ;) ;)

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