2008-09-10 6 views
24

Je dois énumérer tous les types définis par l'utilisateur créés dans une base de données SQL Server avec CREATE TYPE, et/ou découvrir s'ils ont déjà été définis.Comment puis-je lister les types définis par l'utilisateur dans une base de données SQL Server?

Avec des tables ou des procédures stockées que je ferais quelque chose comme ceci:

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

Cependant je ne peux pas trouver l'équivalent (ou une alternative appropriée) pour les types définis par l'utilisateur! Je ne peux certainement pas les voir n'importe où dans sysobjects.

Quelqu'un peut-il m'éclairer?

Répondre

54

Les types et les types UDT n'apparaissent pas dans sys.objects. Vous devriez être en mesure d'obtenir ce que vous cherchez ce qui suit:

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

Comment pouvons-nous obtenir la description de type (par exemple le tableau défini par l'utilisateur de type)? – Naomi

6

Bien que le poste est vieux, je l'ai trouvé utile d'utiliser une requête similaire à cela. Vous ne trouverez peut-être pas une partie du formatage utile, mais je voulais le nom de type complet et je voulais voir les colonnes répertoriées dans l'ordre. Vous pouvez simplement supprimer tous les éléments SUBSTRING pour obtenir le nom de la colonne par lui-même.

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

Pour développer la réponse de jwolly2, voici comment vous obtenez une liste de définitions, y compris le type de données standard:

-- 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 
Questions connexes