2017-08-11 2 views
1

Lors de la création d'une fonction ou d'un déclencheur, vous pouvez trouver la commande de création en sys.sql_modulesObtenir texte sql d'un UDT

Mais ce que je ne peux pas sembler trouver est la même pour UDT.

Lorsque je crée un type comme celui-ci

CREATE TYPE dbo.UserIds AS TABLE (value int NOT NULL PRIMARY KEY); 

il ne montre pas en sys.sql_modules.

La seule information que je peux trouver est de sys.types

select * from sys.types where is_user_defined = 1 

mais il n'y a pas d'instruction SQL. Alors, où puis-je le trouver?

+1

Vous pouvez obtenir des informations à partir des métadonnées. Je vais fournir un échantillon – lad2025

+0

@ G.SAbhaypal Qui a dit quelque chose à propos de 'sys.objects'? – lad2025

Répondre

1

Vous pouvez obtenir des informations sur le type de table et colonnes de métadonnées:

CREATE TYPE dbo.UserIds AS TABLE (value int NOT NULL PRIMARY KEY); 

-- 
DECLARE @name SYSNAME = 'UserIds'; 

SELECT sch = SCHEMA_NAME(t.schema_id) 
    ,t.name 
    ,type  = TYPE_NAME(t.user_type_id) 
    ,c.name 
    ,col_type = TYPE_NAME(c.user_type_id) 
    ,c.is_nullable 
    --.... more info about max_length (if text) and so on 
FROM sys.table_types t 
JOIN sys.columns c 
    ON t.type_table_object_id = c.object_id 
WHERE t.name = @name; 

Sur la base de cette information, vous pouvez recréer instruction DDL.

EDIT:

Si vous voulez script, il le plus simple est d'utiliser SSMS. Right-click ->Script object as (même chose pour les types simples).

enter image description here

+0

Ce n'est pas assez parce que la définition TYPE peut inclure des index si quelqu'un déclare la table avec PK ou unique – sepupic

+0

@sepupic 'LEFT JOIN' à' sys.indexes' et 'sys.index_columns' devrait le résoudre – lad2025

+0

Types ne pas nécessairement besoin d'être des tables, mais je suppose que c'est la meilleure information que je peux obtenir ici. Donc, je vais accepter cela comme une réponse tôt ou tard, si personne d'autre n'a une meilleure solution. Merci beaucoup. – CSharpie

0

Les types et les UDT n'apparaissent pas dans sys.objects ou dans sys.sql_modules, simplement parce qu'ils ne sont pas des modules mais des types.

Pour obtenir le script d'un UDT, vous devez rejoindre sys.types avec sys.schemas, sur le champ schema_id. et encore vous devez faire un peu d'analyse et de conversion je suppose.

+0

Eh bien, vous avez un point, mais il ne répond pas à ma question. – CSharpie

+0

Je viens d'éditer mon post –

1

Ce n'est pas si simple d'obtenir une définition de type, vous pouvez prouver à vous-même ly lancer Profiler et demander SSMS pour générer un script CREATE pour votre type.

Voici ce que j'ai:

exec sp_executesql N'SELECT 
SCHEMA_NAME(tt.schema_id) AS [Schema], 
tt.name AS [Name] 
FROM 
sys.table_types AS tt 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
WHERE 
([email protected]_msparam_0 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_1)',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',@_msparam_0=N'YourType',@_msparam_1=N'dbo' 

exec sp_executesql N'SELECT 
clmns.column_id AS [ID], 
clmns.name AS [Name] 
FROM 
sys.table_types AS tt 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tt.type_table_object_id 
WHERE 
([email protected]_msparam_0 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_1) 
ORDER BY 
[ID] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',@_msparam_0=N'YourType',@_msparam_1=N'dbo' 

exec sp_executesql N'SELECT 
p.name AS [Name] 
FROM 
sys.table_types AS tt 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tt.type_table_object_id 
INNER JOIN sys.extended_properties AS p ON p.major_id=tt.user_type_id AND p.minor_id=clmns.column_id AND p.class=8 
WHERE 
([email protected]_msparam_0)and(([email protected]_msparam_1 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_2)) 
ORDER BY 
[Name] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000)',@_msparam_0=N'id_banca',@_msparam_1=N'YourType',@_msparam_2=N'dbo' 

exec sp_executesql N'SELECT 
p.name AS [Name] 
FROM 
sys.table_types AS tt 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
INNER JOIN sys.extended_properties AS p ON p.major_id=tt.user_type_id AND p.minor_id=0 AND p.class=6 
WHERE 
([email protected]_msparam_0 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_1) 
ORDER BY 
[Name] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',@_msparam_0=N'YourType',@_msparam_1=N'dbo' 

exec sp_executesql N'SELECT 
cstr.name AS [Name] 
FROM 
sys.table_types AS tt 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
INNER JOIN sys.check_constraints AS cstr ON cstr.parent_object_id=tt.type_table_object_id 
WHERE 
([email protected]_msparam_0 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_1) 
ORDER BY 
[Name] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',@_msparam_0=N'YourType',@_msparam_1=N'dbo' 


exec sp_executesql N'SELECT 
ISNULL(s1tt.name, N'''') AS [Owner], 
CAST(case when tt.principal_id is null then 1 else 0 end AS bit) AS [IsSchemaOwned], 
tt.name AS [Name], 
tt.type_table_object_id AS [ID], 
SCHEMA_NAME(tt.schema_id) AS [Schema], 
obj.create_date AS [CreateDate], 
obj.modify_date AS [DateLastModified], 
tt.max_length AS [MaxLength], 
tt.is_nullable AS [Nullable], 
ISNULL(tt.collation_name, N'''') AS [Collation], 
CAST(case when tt.is_user_defined = 1 then 1 else 0 end AS bit) AS [IsUserDefined] 
FROM 
sys.table_types AS tt 
LEFT OUTER JOIN sys.database_principals AS s1tt ON s1tt.principal_id = ISNULL(tt.principal_id, (TYPEPROPERTY(QUOTENAME(SCHEMA_NAME(tt.schema_id)) + ''.'' + QUOTENAME(tt.name), ''OwnerId''))) 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
LEFT OUTER JOIN sys.objects AS obj ON obj.object_id = tt.type_table_object_id 
WHERE 
([email protected]_msparam_0 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_1)',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',@_msparam_0=N'YourType',@_msparam_1=N'dbo' 


exec sp_executesql N'SELECT 
clmns.name AS [Name], 
clmns.column_id AS [ID], 
clmns.is_nullable AS [Nullable], 
clmns.is_computed AS [Computed], 
CAST(ISNULL(cik.index_column_id, 0) AS bit) AS [InPrimaryKey], 
clmns.is_ansi_padded AS [AnsiPaddingStatus], 
CAST(clmns.is_rowguidcol AS bit) AS [RowGuidCol], 
CAST(ISNULL(COLUMNPROPERTY(clmns.object_id, clmns.name, N''IsDeterministic''),0) AS bit) AS [IsDeterministic], 
CAST(ISNULL(COLUMNPROPERTY(clmns.object_id, clmns.name, N''IsPrecise''),0) AS bit) AS [IsPrecise], 
CAST(ISNULL(cc.is_persisted, 0) AS bit) AS [IsPersisted], 
ISNULL(clmns.collation_name, N'''') AS [Collation], 
CAST(ISNULL((select TOP 1 1 from sys.foreign_key_columns AS colfk where colfk.parent_column_id = clmns.column_id and colfk.parent_object_id = clmns.object_id), 0) AS bit) AS [IsForeignKey], 
clmns.is_identity AS [Identity], 
CAST(ISNULL(ic.seed_value,0) AS bigint) AS [IdentitySeed], 
CAST(ISNULL(ic.increment_value,0) AS bigint) AS [IdentityIncrement], 
(case when clmns.default_object_id = 0 then N'''' when d.parent_object_id > 0 then N'''' else d.name end) AS [Default], 
(case when clmns.default_object_id = 0 then N'''' when d.parent_object_id > 0 then N'''' else schema_name(d.schema_id) end) AS [DefaultSchema], 
(case when clmns.rule_object_id = 0 then N'''' else r.name end) AS [Rule], 
(case when clmns.rule_object_id = 0 then N'''' else schema_name(r.schema_id) end) AS [RuleSchema], 
ISNULL(ic.is_not_for_replication, 0) AS [NotForReplication], 
CAST(COLUMNPROPERTY(clmns.object_id, clmns.name, N''IsFulltextIndexed'') AS bit) AS [IsFullTextIndexed], 
CAST(COLUMNPROPERTY(clmns.object_id, clmns.name, N''StatisticalSemantics'') AS int) AS [StatisticalSemantics], 
CAST(clmns.is_filestream AS bit) AS [IsFileStream], 
CAST(clmns.is_sparse AS bit) AS [IsSparse], 
CAST(clmns.is_column_set AS bit) AS [IsColumnSet], 
usrt.name AS [DataType], 
s1clmns.name AS [DataTypeSchema], 
ISNULL(baset.name, N'''') AS [SystemType], 
CAST(CASE WHEN baset.name IN (N''nchar'', N''nvarchar'') AND clmns.max_length <> -1 THEN clmns.max_length/2 ELSE clmns.max_length END AS int) AS [Length], 
CAST(clmns.precision AS int) AS [NumericPrecision], 
CAST(clmns.scale AS int) AS [NumericScale], 
ISNULL(xscclmns.name, N'''') AS [XmlSchemaNamespace], 
ISNULL(s2clmns.name, N'''') AS [XmlSchemaNamespaceSchema], 
ISNULL((case clmns.is_xml_document when 1 then 2 else 1 end), 0) AS [XmlDocumentConstraint], 
CASE WHEN usrt.is_table_type = 1 THEN N''structured'' ELSE N'''' END AS [UserType] 
FROM 
sys.table_types AS tt 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tt.type_table_object_id 
LEFT OUTER JOIN sys.indexes AS ik ON ik.object_id = clmns.object_id and 1=ik.is_primary_key 
LEFT OUTER JOIN sys.index_columns AS cik ON cik.index_id = ik.index_id and cik.column_id = clmns.column_id and cik.object_id = clmns.object_id and 0 = cik.is_included_column 
LEFT OUTER JOIN sys.computed_columns AS cc ON cc.object_id = clmns.object_id and cc.column_id = clmns.column_id 
LEFT OUTER JOIN sys.identity_columns AS ic ON ic.object_id = clmns.object_id and ic.column_id = clmns.column_id 
LEFT OUTER JOIN sys.objects AS d ON d.object_id = clmns.default_object_id 
LEFT OUTER JOIN sys.objects AS r ON r.object_id = clmns.rule_object_id 
LEFT OUTER JOIN sys.types AS usrt ON usrt.user_type_id = clmns.user_type_id 
LEFT OUTER JOIN sys.schemas AS s1clmns ON s1clmns.schema_id = usrt.schema_id 
LEFT OUTER JOIN sys.types AS baset ON (baset.user_type_id = clmns.system_type_id and baset.user_type_id = baset.system_type_id) or ((baset.system_type_id = clmns.system_type_id) and (baset.user_type_id = clmns.user_type_id) and (baset.is_user_defined = 0) and (baset.is_assembly_type = 1)) 
LEFT OUTER JOIN sys.xml_schema_collections AS xscclmns ON xscclmns.xml_collection_id = clmns.xml_collection_id 
LEFT OUTER JOIN sys.schemas AS s2clmns ON s2clmns.schema_id = xscclmns.schema_id 
WHERE 
([email protected]_msparam_0)and(([email protected]_msparam_1 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_2))',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000)',@_msparam_0=N'id_banca',@_msparam_1=N'YourType',@_msparam_2=N'dbo' 

exec sp_executesql N'SELECT 
cstr.name AS [Name] 
FROM 
sys.table_types AS tt 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tt.type_table_object_id 
INNER JOIN sys.default_constraints AS cstr ON cstr.object_id=clmns.default_object_id 
WHERE 
([email protected]_msparam_0)and(([email protected]_msparam_1 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_2)) 
ORDER BY 
[Name] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000)',@_msparam_0=N'id_banca',@_msparam_1=N'YourType',@_msparam_2=N'dbo' 

exec sp_executesql N'SELECT 
i.name AS [Name], 
CAST(i.index_id AS int) AS [ID], 
CAST(OBJECTPROPERTY(i.object_id,N''IsMSShipped'') AS bit) AS [IsSystemObject], 
ISNULL(s.no_recompute,0) AS [NoAutomaticRecomputation], 
i.fill_factor AS [FillFactor], 
CAST(CASE i.index_id WHEN 1 THEN 1 ELSE 0 END AS bit) AS [IsClustered], 
i.is_primary_key + 2*i.is_unique_constraint AS [IndexKeyType], 
i.is_unique AS [IsUnique], 
i.ignore_dup_key AS [IgnoreDuplicateKeys], 
~i.allow_row_locks AS [DisallowRowLocks], 
~i.allow_page_locks AS [DisallowPageLocks], 
CAST(ISNULL(INDEXPROPERTY(i.object_id, i.name, N''IsPadIndex''), 0) AS bit) AS [PadIndex], 
i.is_disabled AS [IsDisabled], 
CAST(ISNULL(k.is_system_named, 0) AS bit) AS [IsSystemNamed], 
CAST(INDEXPROPERTY(i.object_id,i.name,N''IsFulltextKey'') AS bit) AS [IsFullTextKey], 
CAST(case when i.type=3 then 1 else 0 end AS bit) AS [IsXmlIndex], 
case UPPER(ISNULL(xi.secondary_type,'''')) when ''P'' then 1 when ''V'' then 2 when ''R'' then 3 else 0 end AS [SecondaryXmlIndexType], 
ISNULL(xi2.name, N'''') AS [ParentXmlIndex], 
CAST(ISNULL(spi.spatial_index_type,0) AS tinyint) AS [SpatialIndexType], 
CAST(ISNULL(si.bounding_box_xmin,0) AS float(53)) AS [BoundingBoxXMin], 
CAST(ISNULL(si.bounding_box_ymin,0) AS float(53)) AS [BoundingBoxYMin], 
CAST(ISNULL(si.bounding_box_xmax,0) AS float(53)) AS [BoundingBoxXMax], 
CAST(ISNULL(si.bounding_box_ymax,0) AS float(53)) AS [BoundingBoxYMax], 
CAST(ISNULL(si.level_1_grid,0) AS smallint) AS [Level1Grid], 
CAST(ISNULL(si.level_2_grid,0) AS smallint) AS [Level2Grid], 
CAST(ISNULL(si.level_3_grid,0) AS smallint) AS [Level3Grid], 
CAST(ISNULL(si.level_4_grid,0) AS smallint) AS [Level4Grid], 
CAST(ISNULL(si.cells_per_object,0) AS int) AS [CellsPerObject], 
CAST(case when i.type=4 then 1 else 0 end AS bit) AS [IsSpatialIndex], 
i.has_filter AS [HasFilter], 
ISNULL(i.filter_definition, N'''') AS [FilterDefinition], 
CASE WHEN ''FG''=dsi.type THEN dsi.name ELSE N'''' END AS [FileGroup], 
CASE WHEN ''PS''=dsi.type THEN dsi.name ELSE N'''' END AS [PartitionScheme], 
CAST(CASE WHEN ''PS''=dsi.type THEN 1 ELSE 0 END AS bit) AS [IsPartitioned], 
CASE WHEN ''FD''=dstbl.type THEN dstbl.name ELSE N'''' END AS [FileStreamFileGroup], 
CASE WHEN ''PS''=dstbl.type THEN dstbl.name ELSE N'''' END AS [FileStreamPartitionScheme], 
CAST(CASE WHEN filetableobj.object_id IS NULL THEN 0 ELSE 1 END AS bit) AS [IsFileTableDefined], 
CAST(
      CASE i.type WHEN 1 THEN 0 WHEN 4 THEN 4 
         WHEN 3 THEN CASE xi.xml_index_type WHEN 0 THEN 2 WHEN 1 THEN 3 WHEN 2 THEN 7 WHEN 3 THEN 8 END 
         WHEN 4 THEN 4 WHEN 6 THEN 5 ELSE 1 END 
     AS tinyint) AS [IndexType], 

     ISNULL(indexedpaths.name, N'''') 
     AS [IndexedXmlPathName] 
FROM 
sys.table_types AS tt 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
INNER JOIN sys.indexes AS i ON (i.index_id > @_msparam_0 and i.is_hypothetical = @_msparam_1) AND (i.object_id=tt.type_table_object_id) 
LEFT OUTER JOIN sys.stats AS s ON s.stats_id = i.index_id AND s.object_id = i.object_id 
LEFT OUTER JOIN sys.key_constraints AS k ON k.parent_object_id = i.object_id AND k.unique_index_id = i.index_id 
LEFT OUTER JOIN sys.xml_indexes AS xi ON xi.object_id = i.object_id AND xi.index_id = i.index_id 
LEFT OUTER JOIN sys.xml_indexes AS xi2 ON xi2.object_id = xi.object_id AND xi2.index_id = xi.using_xml_index_id 
LEFT OUTER JOIN sys.spatial_indexes AS spi ON i.object_id = spi.object_id and i.index_id = spi.index_id 
LEFT OUTER JOIN sys.spatial_index_tessellations as si ON i.object_id = si.object_id and i.index_id = si.index_id 
LEFT OUTER JOIN sys.data_spaces AS dsi ON dsi.data_space_id = i.data_space_id 
LEFT OUTER JOIN sys.tables AS t ON t.object_id = i.object_id 
LEFT OUTER JOIN sys.data_spaces AS dstbl ON dstbl.data_space_id = t.Filestream_data_space_id and (i.index_id < 2 or (i.type = 7 and i.index_id < 3)) 
LEFT OUTER JOIN sys.filetable_system_defined_objects AS filetableobj ON i.object_id = filetableobj.object_id 
LEFT OUTER JOIN sys.selective_xml_index_paths AS indexedpaths ON xi.object_id = indexedpaths.object_id AND xi.using_xml_index_id = indexedpaths.index_id AND xi.path_id = indexedpaths.path_id 
WHERE 
([email protected]_msparam_2)and(([email protected]_msparam_3 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_4))',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000),@_msparam_4 nvarchar(4000)',@_msparam_0=N'0',@_msparam_1=N'0',@_msparam_2=N'PK__TT_id_ba__70BD165044265C38',@_msparam_3=N'YourType',@_msparam_4=N'dbo' 

exec sp_executesql N'SELECT 
(case ic.key_ordinal when 0 then ic.index_column_id else ic.key_ordinal end) AS [ID], 
clmns.name AS [Name] 
FROM 
sys.table_types AS tt 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
INNER JOIN sys.indexes AS i ON (i.index_id > @_msparam_0 and i.is_hypothetical = @_msparam_1) AND (i.object_id=tt.type_table_object_id) 
INNER JOIN sys.index_columns AS ic ON (ic.column_id > 0 and (ic.key_ordinal > 0 or ic.partition_ordinal = 0 or ic.is_included_column != 0)) AND (ic.index_id=CAST(i.index_id AS int) AND ic.object_id=i.object_id) 
INNER JOIN sys.columns AS clmns ON clmns.object_id = ic.object_id and clmns.column_id = ic.column_id 
WHERE 
([email protected]_msparam_2)and(([email protected]_msparam_3 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_4)) 
ORDER BY 
[ID] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000),@_msparam_4 nvarchar(4000)',@_msparam_0=N'0',@_msparam_1=N'0',@_msparam_2=N'PK__TT_id_ba__70BD165044265C38',@_msparam_3=N'YourType',@_msparam_4=N'dbo' 

exec sp_executesql N'SELECT 
clmns.name AS [Name], 
(case ic.key_ordinal when 0 then ic.index_column_id else ic.key_ordinal end) AS [ID], 
CAST(COLUMNPROPERTY(ic.object_id, clmns.name, N''IsComputed'') AS bit) AS [IsComputed], 
ic.is_descending_key AS [Descending], 
ic.is_included_column AS [IsIncluded] 
FROM 
sys.table_types AS tt 
INNER JOIN sys.schemas AS stt ON stt.schema_id = tt.schema_id 
INNER JOIN sys.indexes AS i ON (i.index_id > @_msparam_0 and i.is_hypothetical = @_msparam_1) AND (i.object_id=tt.type_table_object_id) 
INNER JOIN sys.index_columns AS ic ON (ic.column_id > 0 and (ic.key_ordinal > 0 or ic.partition_ordinal = 0 or ic.is_included_column != 0)) AND (ic.index_id=CAST(i.index_id AS int) AND ic.object_id=i.object_id) 
INNER JOIN sys.columns AS clmns ON clmns.object_id = ic.object_id and clmns.column_id = ic.column_id 
WHERE 
([email protected]_msparam_2)and(([email protected]_msparam_3)and(([email protected]_msparam_4 and SCHEMA_NAME(tt.schema_id)[email protected]_msparam_5)))',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000),@_msparam_4 nvarchar(4000),@_msparam_5 nvarchar(4000)',@_msparam_0=N'0',@_msparam_1=N'0',@_msparam_2=N'id_banca',@_msparam_3=N'PK__TT_id_ba__70BD165044265C38',@_msparam_4=N'YourType',@_msparam_5=N'dbo' 

Ceci est pour vous donner une idée de la complexité, il est