不能不佩服Red Gate的强大,旗下产品SQL Prompt 是我最喜欢的,SQL Doc生成数据库文档的确非常方便,而且支持在操作中修改表、字段、数据库、存储过程、函数的描述信息,生成的文档支持html和chm两种方式,排版效果都很不错。
    很好奇SQL Doc是怎么获取数据库所有表的信息,比如数据库下的所以表名,表的字段信息,字段是否为空,关系,索引信息等,于是用Sql Profiler监视一下,果然是厉害,其实如果要做数据库实体类代码生成,ORM都有可能用到。
SQL Doc获取表结构信息的SQL
SQL Doc获取表结构信息的SQL
SELECT sp.major_id AS id, 
SQL Doc获取表结构信息的SQLso.name 
AS ObjectName, 
SQL Doc获取表结构信息的SQLsys.schemas.name 
AS ObjectOwner,  
SQL Doc获取表结构信息的SQLso.type 
AS ObjectType, 
SQL Doc获取表结构信息的SQLsp.minor_id 
AS smallid,  
SQL Doc获取表结构信息的SQLsp.name 
AS PropertyName, 
SQL Doc获取表结构信息的SQLsp.value 
AS PropertyValue,
SQL Doc获取表结构信息的SQL
CAST(sp.value AS varbinary(MAX)) AS PropertyValueBinary,
SQL Doc获取表结构信息的SQLsql_variant_property(sp.value,
'BaseType'AS PropertyValueBaseType,
SQL Doc获取表结构信息的SQLsql_variant_property(sp.value,
'Precision'AS PropertyValuePrecision,
SQL Doc获取表结构信息的SQLsql_variant_property(sp.value,
'Scale'AS PropertyValueScale,
SQL Doc获取表结构信息的SQLsql_variant_property(sp.value,
'MaxLength'AS PropertyValueMaxLength,
SQL Doc获取表结构信息的SQL
CASE sp.class WHEN 4 THEN USER_NAME(sp.major_id) END AS UserName,
SQL Doc获取表结构信息的SQL
CASE sp.class WHEN 6 THEN (SELECT TOP 1 name FROM sys.types sst WHERE sst.user_type_id=sp.major_id) END AS UDTName,
SQL Doc获取表结构信息的SQL
CASE sp.class WHEN 6 THEN (SELECT TOP 1 sys.schemas.name FROM sys.schemas INNER JOIN sys.types ON sys.types.schema_id=sys.schemas.schema_id WHERE sys.types.user_type_id=sp.major_id) END AS UDTOwner,
SQL Doc获取表结构信息的SQL
CASE sp.class
SQL Doc获取表结构信息的SQL    
WHEN  3 THEN (SELECT TOP 1 ss2.name as a FROM sys.schemas ss2 WITH (NOLOCK) WHERE ss2.schema_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN  5 THEN (SELECT TOP 1 sa2.name as a FROM sys.assemblies sa2 WITH (NOLOCK) WHERE sa2.assembly_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 10 THEN (SELECT TOP 1 sxsc2.name as a FROM sys.xml_schema_collections sxsc2 WITH (NOLOCK) WHERE sxsc2.xml_collection_id = sp.major_id) COLLATE database_default
SQL Doc获取表结构信息的SQL    
WHEN 15 THEN (SELECT TOP 1 smt2.name FROM sys.service_message_types smt2 WITH (NOLOCK) WHERE smt2.message_type_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 16 THEN (SELECT TOP 1 ssc2.name FROM sys.service_contracts ssc2 WITH (NOLOCK) WHERE ssc2.service_contract_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 17 THEN (SELECT TOP 1 ss2.name FROM sys.services ss2 WITH (NOLOCK) WHERE ss2.service_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 18 THEN (SELECT TOP 1 srs2.name FROM sys.remote_service_bindings srs2 WITH (NOLOCK) WHERE srs2.remote_service_binding_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 19 THEN (SELECT TOP 1 sr2.name FROM sys.routes sr2 WITH (NOLOCK) WHERE sr2.route_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 20 THEN (SELECT TOP 1 sps2.name FROM sys.partition_schemes sps2 WITH (NOLOCK) WHERE sps2.data_space_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 21 THEN (SELECT TOP 1 spf2.name FROM sys.partition_functions spf2 WITH (NOLOCK) WHERE spf2.function_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
ELSE CAST(NULL AS sysname)
SQL Doc获取表结构信息的SQL
END AS YukonObjectName,
SQL Doc获取表结构信息的SQL
CASE sp.class 
SQL Doc获取表结构信息的SQL    
WHEN 10 THEN SCHEMA_NAME(( SELECT TOP 1 sx2.schema_id FROM sys.xml_schema_collections sx2 WITH (NOLOCK) WHERE sx2.xml_collection_id = sp.major_id))
SQL Doc获取表结构信息的SQL    
WHEN 6 THEN SCHEMA_NAME((SELECT TOP 1 st2.schema_id FROM sys.types st2 WITH (NOLOCK) WHERE st2.user_type_id = sp.major_id))
SQL Doc获取表结构信息的SQL
ELSE 
SQL Doc获取表结构信息的SQL
USER_NAME(CASE sp.class 
SQL Doc获取表结构信息的SQL    
WHEN 3 THEN (SELECT TOP 1 sch2.principal_id FROM sys.schemas sch2 WITH (NOLOCK) WHERE sch2.schema_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 4 THEN (SELECT TOP 1 sp2.owning_principal_id FROM sys.database_principals sp2 WITH (NOLOCK) WHERE sp2.principal_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 5 THEN (SELECT TOP 1 sa2.principal_id FROM sys.assemblies sa2 WITH (NOLOCK) WHERE sa2.assembly_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 15 THEN (SELECT TOP 1 smt2.principal_id FROM sys.service_message_types smt2 WITH (NOLOCK) WHERE smt2.message_type_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 16 THEN (SELECT TOP 1 ssc2.principal_id FROM sys.service_contracts ssc2 WITH (NOLOCK) WHERE ssc2.service_contract_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 17 THEN (SELECT TOP 1 ss2.principal_id FROM sys.services ss2 WITH (NOLOCK) WHERE ss2.service_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 18 THEN (SELECT TOP 1 srs2.principal_id FROM sys.remote_service_bindings srs2 WITH (NOLOCK) WHERE srs2.remote_service_binding_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 19 THEN (SELECT TOP 1 sr2.principal_id FROM sys.routes sr2 WITH (NOLOCK) WHERE sr2.route_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 23 THEN (SELECT TOP 1 sft2.principal_id FROM sys.fulltext_catalogs sft2 WITH (NOLOCK) WHERE sft2.fulltext_catalog_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 24 THEN (SELECT TOP 1 ssk2.principal_id FROM sys.symmetric_keys ssk2 WITH (NOLOCK) WHERE ssk2.symmetric_key_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 26 THEN (SELECT TOP 1 sak2.principal_id FROM sys.asymmetric_keys sak2 WITH (NOLOCK) WHERE sak2.asymmetric_key_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
WHEN 25 THEN (SELECT TOP 1 sc2.principal_id FROM sys.certificates sc2 WITH (NOLOCK) WHERE sc2.certificate_id = sp.major_id)
SQL Doc获取表结构信息的SQL    
ELSE CAST(NULL AS sysname)
SQL Doc获取表结构信息的SQL
END)
SQL Doc获取表结构信息的SQL
END AS YukonObjectOwner,
SQL Doc获取表结构信息的SQL
CASE sp.class
SQL Doc获取表结构信息的SQL    
WHEN 2 then spar.name
SQL Doc获取表结构信息的SQL    
ELSE sc.name
SQL Doc获取表结构信息的SQL
END AS FieldName,
SQL Doc获取表结构信息的SQLsi.name 
AS IndexName,
SQL Doc获取表结构信息的SQLpso.name 
AS ParentName,
SQL Doc获取表结构信息的SQLpu.name 
AS ParentOwner,
SQL Doc获取表结构信息的SQLpso.type 
AS ParentType,
SQL Doc获取表结构信息的SQLsp.class 
AS type,
SQL Doc获取表结构信息的SQLddlt.name 
AS DdlTriggerName,
SQL Doc获取表结构信息的SQLen.name 
AS EventNotificiationName,
SQL Doc获取表结构信息的SQLqensq.name 
AS ENQueueName,
SQL Doc获取表结构信息的SQLqensqs.name 
AS ENQueueSchema
SQL Doc获取表结构信息的SQL
SQL Doc获取表结构信息的SQL
FROM sys.extended_properties AS sp WITH (NOLOCK) 
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.objects  AS so WITH (NOLOCK) ON so.object_id=sp.major_id
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.schemas  WITH (NOLOCK) ON sys.schemas.schema_id=so.schema_id
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.columns AS sc WITH (NOLOCK) ON sc.object_id=sp.major_id AND sc.column_id=sp.minor_id
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.parameters AS spar WITH (NOLOCK) ON spar.object_id=sp.major_id AND spar.parameter_id=sp.minor_id
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.indexes si WITH (NOLOCK) ON si.object_id=sp.major_id AND si.index_id=sp.minor_id
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.objects pso  WITH (NOLOCK) ON so.parent_object_id=pso.object_id
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.schemas pu  WITH (NOLOCK) ON pso.schema_id=pu.schema_id
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.triggers  AS ddlt WITH (NOLOCK) ON ddlt.object_id=sp.major_id
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.event_notifications  AS en WITH (NOLOCK) ON en.object_id=sp.major_id
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.service_queues  AS qensq WITH (NOLOCK) ON qensq.object_id=en.parent_id
SQL Doc获取表结构信息的SQL
LEFT JOIN sys.schemas AS qensqs WITH (NOLOCK) ON qensqs.schema_id=qensq.SCHEMA_ID
SQL Doc获取表结构信息的SQL
WHERE so.NAME='schools'

最后一行Where so.NAME='schools',是只获取表名为Schools的信息,把这个Where条件去掉,则获取当前数据库的所有对象的架构信息。

相比SubSonic 2.2中获取数据库对象详细信息,SQL Doc要详细和准确一些,经我的测试,对于字段描述信息,如果删除某个表的字段,SubSonic的方式获取字段描述信息有可能会出现错位的情况,下面是SubSonic中的获取数据库表详细信息的SQL:
 
 

相关文章:

  • 2022-12-23
  • 2021-05-21
  • 2022-12-23
  • 2021-11-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-25
  • 2022-02-07
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-18
  • 2022-12-23
相关资源
相似解决方案