Как мне перечислить пользовательские типы в базе данных SQL Server? - PullRequest
29 голосов
/ 10 сентября 2008

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

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

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

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

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

Ответы [ 3 ]

62 голосов
/ 10 сентября 2008

Типы и UDT не отображаются в объектах sys.object. Вы должны быть в состоянии получить то, что вы ищете, со следующим:

select * from sys.types
where is_user_defined = 1
10 голосов
/ 22 июля 2015

Хотя пост старый, я нашел полезным использовать запрос, похожий на этот. Возможно, вы не сочтете нужным форматирование, но мне нужно было полное имя типа, и я хотел видеть столбцы в порядке. Вы можете просто удалить все элементы 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 голосов
/ 24 января 2018

Чтобы расширить ответ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...