¿Cómo enumero los tipos definidos por el usuario en una base de datos de SQL Server?
-
09-06-2019 - |
Pregunta
Necesito enumerar todos los tipos definidos por el usuario creados en un SQL Server
base de datos con CREATE TYPE
, y/o averiguar si ya han sido definidos.
Con tablas o procedimientos almacenados haría algo como esto:
if exists (select * from dbo.sysobjects where name='foobar' and xtype='U')
drop table foobar
Sin embargo, no puedo encontrar el equivalente (o una alternativa adecuada) para los tipos definidos por el usuario.Definitivamente no puedo verlos en ninguna parte sysobjects
.
¿Alguien puede iluminarme?
Solución
Los tipos y UDT no aparecen en sys.objects.Debería poder obtener lo que está buscando con lo siguiente:
select * from sys.types
where is_user_defined = 1
Otros consejos
Aunque la publicación es antigua, me resultó útil utilizar una consulta similar a esta.Es posible que parte del formato no le resulte útil, pero quería el nombre de tipo completo y quería ver las columnas enumeradas en orden.Puede eliminar todo el material de SUBSTRING para obtener el nombre de la columna por sí solo.
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
Para ampliar la respuesta de jwolly2, así es como se obtiene una lista de definiciones que incluyen el tipo de datos estándar:
-- 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