代码之家  ›  专栏  ›  技术社区  ›  jammycakes

如何在SQL Server数据库中列出用户定义的类型?

  •  28
  • jammycakes  · 技术社区  · 16 年前

    我需要枚举在 SQL Server 数据库与 CREATE TYPE 和/或找出它们是否已经被定义。

    对于表或存储过程,我会这样做:

    if exists (select * from dbo.sysobjects where name='foobar' and xtype='U')
        drop table foobar
    

    但是,我找不到用户定义类型的等效项(或合适的替代项)!我绝对看不到他们在任何地方 sysobjects .

    有人能启发我吗?

    3 回复  |  直到 7 年前
        1
  •  60
  •   Robin    16 年前

    类型和UDT不会出现在sys.objects中。 您应该能够通过以下方式获得所需的内容:

    select * from sys.types
    where is_user_defined = 1
    
        2
  •  9
  •   Ron Sanderson ses    9 年前

    虽然这篇文章很旧,但我发现使用类似这样的查询很有用。 您可能不会发现某些格式有用,但我需要完全限定的类型名,并且希望看到按顺序列出的列。您只需删除所有子字符串内容,就可以自己获取列名。

    SELECT USER_NAME(TYPE.schema_id) + '.' + TYPE.name      AS "Type Name",
           COL.column_id,
           SUBSTRING(CAST(COL.column_id + 100 AS char(3)), 2, 2)  + ': ' + COL.name   AS "Column",
           ST.name                                          AS "Data Type",
           CASE COL.Is_Nullable
           WHEN 1 THEN ''
           ELSE        'NOT NULL' 
           END                                              AS "Nullable",
           COL.max_length                                   AS "Length",
           COL.[precision]                                  AS "Precision",
           COL.scale                                        AS "Scale",
           ST.collation                                     AS "Collation"
    FROM sys.table_types TYPE
    JOIN sys.columns     COL
        ON TYPE.type_table_object_id = COL.object_id
    JOIN sys.systypes AS ST  
        ON ST.xtype = COL.system_type_id
    where TYPE.is_user_defined = 1
    ORDER BY "Type Name",
             COL.column_id
    
        3
  •  3
  •   Ton Plooij    7 年前

    要扩展Jwolly2的答案,下面是如何获得包括标准数据类型在内的定义列表:

    -- User Defined Type definitions TP 20180124
    select t1.name, t2.name, t1.precision, t1.scale, t1.max_length as bytes, t1.is_nullable
    from sys.types t1
    join sys.types t2 on t2.system_type_id = t1.system_type_id and t2.is_user_defined = 0
    where t1.is_user_defined = 1 and t2.name <> 'sysname'
    order by t1.name