Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server crée des types de table définis par l'utilisateur avec un schéma qui ne fonctionne pas correctement

Au lieu de chercher dans sys.objects pour ceux-ci, vous devriez regarder dans sys.types ou sys.table_types (qui expose en outre le type_table_object_id ).

SELECT name,
       schema_id /*Will be the "test" schema id*/
FROM   sys.types
WHERE  is_table_type = 1
       AND name = 'MyUserTableType'

Lorsque vous créez un type défini par l'utilisateur, il ajoute une ligne à sys.sysscalartypes avec le schéma et le nom fournis par l'utilisateur et une ligne vers sys.sysschobjs avec un nom généré par le système dans le sys schéma. Le nom généré par le système est créé en concaténant TT_ + FriendlyName + _ + Version hexadécimale de l'identifiant de l'objet.

Les deux entités sont liées entre elles via sys.syssingleobjrefs

/*This query only works via the DAC*/
SELECT so.id AS object_id,
       st.id AS user_type_id,
       *
FROM   sys.sysschobjs so
       JOIN sys.syssingleobjrefs sor
         ON sor.indepid = so.id
       JOIN sys.sysscalartypes st
         ON st.id = sor.depid
WHERE  st.name = 'MyUserTableType'