2008-09-10 10 views
24

Necesito enumerar todos los tipos definidos por el usuario creados en una base de datos SQL Server con CREATE TYPE, y/o averiguar si ya se han definido.¿Cómo enumero los tipos definidos por el usuario en una base de datos de SQL Server?

Con tablas o procedimientos almacenados que 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 ningún lado en sysobjects.

¿Alguien puede aclararme?

Respuesta

54

Los tipos y UDT no aparecen en sys.objects. Usted debe ser capaz de conseguir lo que está buscando con lo siguiente:

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

¿Cómo podemos obtener la descripción del tipo (por ejemplo definida por el usuario tipo de tabla)? – Naomi

6

Aunque el post es viejo, he encontrado útil el uso de una consulta similar a esto. Es posible que no encuentre útil el formato, pero quería el nombre de tipo completo y quería ver las columnas en orden. Simplemente puede eliminar todas las cosas SUBSTRING para obtener solo el nombre de la columna.

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

Para ampliar la respuesta de jwolly2, aquí es cómo 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 
Cuestiones relacionadas