Подтвердить что ты не робот

Как перечислять пользовательские типы в базе данных SQL Server?

Мне нужно перечислить все пользовательские типы, созданные в базе SQL Server с CREATE TYPE, и/или узнать, были ли они уже определены.

С таблицами или хранимыми процедурами я бы сделал что-то вроде этого:

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

Однако я не могу найти эквивалент (или подходящую альтернативу) для определенных пользователем типов! Я определенно не вижу их нигде в sysobjects.

Может кто-нибудь просветить меня?

4b9b3361

Ответ 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