2008-09-10 2 views
24

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

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

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

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

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

ответ

54

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

select * from sys.types 
where is_user_defined = 1 
+4

Как мы можем получить описание типа в (например, User Defined Type Table)? – Naomi 2016-01-27 21:02:17

6

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

Чтобы расширить ответ 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 
Смежные вопросы