Ответ 1
Типы и UDT не отображаются в sys.objects. Вы должны иметь возможность получить то, что ищете, следующим образом:
select * from sys.types
where is_user_defined = 1
Мне нужно перечислить все пользовательские типы, созданные в базе SQL Server
с CREATE TYPE
, и/или узнать, были ли они уже определены.
С таблицами или хранимыми процедурами я бы сделал что-то вроде этого:
if exists (select * from dbo.sysobjects where name='foobar' and xtype='U')
drop table foobar
Однако я не могу найти эквивалент (или подходящую альтернативу) для определенных пользователем типов! Я определенно не вижу их нигде в sysobjects
.
Может кто-нибудь просветить меня?
Типы и UDT не отображаются в sys.objects. Вы должны иметь возможность получить то, что ищете, следующим образом:
select * from sys.types
where is_user_defined = 1
Хотя сообщение устарело, я счел полезным использовать запрос, подобный этому. Возможно, вы не найдете какое-то форматирование полезным, но мне нужно полное имя типа, и я хотел бы видеть столбцы, перечисленные в порядке. Вы можете просто удалить все материалы 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