【问题标题】:How do I list user defined types in a SQL Server database?如何在 SQL Server 数据库中列出用户定义的类型?
【发布时间】:2010-09-08 10:37:46
【问题描述】:

我需要用CREATE TYPE 枚举在SQL Server 数据库中创建的所有用户定义类型,和/或找出它们是否已经被定义。

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

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

但是我找不到用户定义类型的等价物(或合适的替代品)!我绝对在sysobjects 的任何地方都看不到它们。

谁能赐教?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

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

    select * from sys.types
    where is_user_defined = 1
    

    【讨论】:

    • 我们如何获取类型的描述(例如用户定义的表类型)?
    【解决方案2】:

    虽然帖子很旧,但我发现使用与此类似的查询很有用。 您可能不会发现某些格式有用,但我想要完全限定的类型名称,并且我想查看按顺序列出的列。您可以删除所有 SUBSTRING 内容以单独获取列名。

    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】:

      为了扩展 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
      

      【讨论】:

      • 为什么是 t2.name 'sysname'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多