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

50few1ms  于 2023-02-03  发布在  SQL Server
关注(0)|答案(3)|浏览(212)

我需要使用CREATE TYPE枚举在SQL Server数据库中创建的所有用户定义类型,和/或查看它们是否已经定义。
对于表或存储过程,我会这样做:

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

但是我找不到用户定义类型的等价物(或者合适的替代品)!我在sysobjects中绝对找不到它们。
有人能给我点化一下吗?

von4xj4u

von4xj4u1#

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

select * from sys.types
where is_user_defined = 1
qyuhtwio

qyuhtwio2#

虽然这篇文章很老了,但我发现使用类似的查询很有用。你可能觉得有些格式没有用,但我想要完全限定的类型名称,我想看到按顺序列出的列。你可以删除所有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
gdrx4gfi

gdrx4gfi3#

原文评论:
为了扩展jwolly 2的答案,下面是如何获得包括标准数据类型在内的定义列表:
在注解中编辑:
我刚刚添加了对查询别名/格式的更新,以使查询更具可读性,并更新了连接键,用于消除在“is_user_defined”= 0时过滤掉重复的“system_type_id”值的需要。
这里的想法是我们可以在sys.types表中找到关于类型的信息。
1.当“is_user_defined”= 0时,它是内置类型
1.当“system_type_id”与同一记录上的“user_type_id”匹配时,它是系统类型。
1.当“is_user_defined”= 1时,相关系统类型的“user_type_id”将与用户定义类型的“system_type_id”相同
1.“max_length”字段指的是最大长度,以字节为单位(与字符相反- NVARCHAR(10)为20 / VARCHAR(10)为10)
类型信息查询:

SELECT  UserType.[name] AS UserType
        , SystemType.[name] AS SystemType
        , UserType.[precision]
        , UserType.scale
        , UserType.max_length AS bytes
            --This value indicates max number of bytes as opposed to max length in characters
            -- NVARCHAR(10) would be 20 / VARCHAR(10) would be 10
        , UserType.is_nullable
  FROM  sys.types UserType
      JOIN sys.types SystemType
          ON SystemType.user_type_id = UserType.system_type_id
             AND SystemType.is_user_defined = 0
 WHERE  UserType.is_user_defined = 1
 ORDER BY UserType.[name];

相关问题