微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

生成数据字典(sqlserver)

 --//sql Database documentation script  
--//Author: Nitin Patel,Email: [email protected]   --//Date:18-Feb-2008   --//Description: T-sql script to generate the database document for sql server 2000/2005   Declare @i Int,@maxi Int   Declare @j Int,@maxj Int   Declare @sr int   Declare @Output varchar(4000)   --Declare @tmpOutput varchar(max)   Declare @sqlVersion varchar(5)   Declare @last varchar(155),@current varchar(255),@typ varchar(255),@description varchar(4000)      create Table #Tables  (id int identity(1,1),Object_id int,Name varchar(155),Type varchar(20),[description] varchar(4000))   create Table #Columns (id int identity(1,Type Varchar(155),Nullable varchar(2),[description] varchar(4000))   create Table #Fk(id int identity(1,col Varchar(155),refObj varchar(155),refCol varchar(155))   create Table #Constraint(id int identity(1,deFinition varchar(1000))   create Table #Indexes(id int identity(1,Type Varchar(25),cols varchar(1000))       If (substring(@@VERSION,1,25 ) = 'Microsoft sql Server 2005')       set @sqlVersion = '2005'   else if (substring(@@VERSION,26 ) = 'Microsoft sql Server  2000')       set @sqlVersion = '2000'   else        set @sqlVersion = '2005'         Print '<head>'   Print '<title>::' + DB_name() + '::</title>'   Print '<style>'          Print '     body {'   Print '     font-family:verdana;'   Print '     font-size:9pt;'   Print '     }'              Print '     td {'   Print '     font-family:verdana;'   Print '     font-size:9pt;'   Print '     }'              Print '     th {'   Print '     font-family:verdana;'   Print '     font-size:9pt;'   Print '     background:#d3d3d3;'   Print '     }'   Print '     table'   Print '     {'   Print '     background:#d3d3d3;'   Print '     }'   Print '     tr'   Print '     {'   Print '     background:#ffffff;'   Print '     }'   Print ' </style>'   Print '</head>'   Print '<body>'      set nocount on       if @sqlVersion = '2000'            begin           insert into #Tables (Object_id,Name,Type,[description])               --FOR 2000               select object_id(table_name),  '[' + table_schema + '].[' + table_name + ']',                 case when table_type = 'BASE TABLE'  then 'Table'   else 'View' end,               cast(p.value as varchar(4000))               from @R_100_4045@ion_schema.tables t               left outer join sysproperties p on p.id = object_id(t.table_name) and smallid = 0 and p.name = 'MS_Description'                order by table_type,table_schema,table_name           end       else if @sqlVersion = '2005'            begin           insert into #Tables (Object_id,[description])           --FOR 2005           Select o.object_id,  '[' + s.name + '].[' + o.name + ']',                    case when type = 'V' then 'View' when type = 'U' then 'Table' end,                     cast(p.value as varchar(4000))                   from sys.objects o                        left outer join sys.schemas s on s.schema_id = o.schema_id                        left outer join sys.extended_properties p on p.major_id = o.object_id and minor_id = 0 and p.name = 'MS_Description'                    where type in ('U','V')                    order by type,s.name,o.name           end   Set @maxi = @@rowcount   set @i = 1      print '<table border="0" cellspacing="0" cellpadding="0" width="550px" align="center"><tr><td colspan="3" style="height:50;font-size:14pt;text-align:center;"><a name="index"></a><b>Index</b></td></tr></table>'   print '<table border="0" cellspacing="1" cellpadding="0" width="550px" align="center"><tr><th>Sr</th><th>Object</th><th>Type</th></tr>'    While(@i <= @maxi)   begin       select @Output =  '<tr><td align="center">' + Cast((@i) as varchar) + '</td><td><a href="#' + Type + ':' + name + '">' + name + '</a></td><td>' + Type + '</td></tr>'                from #Tables where id = @i              print @Output       set @i = @i + 1   end   print '</table><br />'      set @i = 1   While(@i <= @maxi)   begin       --table header       select @Output =  '<tr><th align="left"><a name="' + Type + ':' + name + '"></a><b>' + Type + ':' + name + '</b></th></tr>',  @description = [description]               from #Tables where id = @i              print '<br /><br /><br /><table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td align="right"><a href="#index">Index</a></td></tr>'       print @Output       print '</table><br />'       print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Description</b></td></tr><tr><td>' + isnull(@description,'') + '</td></tr></table><br />'           --table columns       t@R_404_6143@ate table #Columns        if @sqlVersion = '2000'            begin           insert into #Columns  (Name,Nullable,[description])           --FOR 2000           Select c.name,                        type_name(xtype) + (                       case when (type_name(xtype) = 'varchar' or type_name(xtype) = 'nvarchar' or type_name(xtype) ='char' or type_name(xtype) ='nchar')                           then '(' + cast(length as varchar) + ')'                         when type_name(xtype) = 'decimal'                                 then '(' + cast(prec as varchar) + ',' + cast(scale as varchar)   + ')'                        else ''                       end                                    ),                        case when isnullable = 1 then 'Y' else 'N'  end,                        cast(p.value as varchar(8000))                   from syscolumns c                       inner join #Tables t on t.object_id = c.id                       left outer join sysproperties p on p.id = c.id and p.smallid = c.colid and p.name = 'MS_Description'                    where t.id = @i                   order by c.colorder           end       else if @sqlVersion = '2005'            begin           insert into #Columns  (Name,[description])           --FOR 2005             Select c.name,                        type_name(user_type_id) + (                       case when (type_name(user_type_id) = 'varchar' or type_name(user_type_id) = 'nvarchar' or type_name(user_type_id) ='char' or type_name(user_type_id) ='nchar')                           then '(' + cast(max_length as varchar) + ')'                         when type_name(user_type_id) = 'decimal'                                 then '(' + cast([precision] as varchar) + ',                        case when is_nullable = 1 then 'Y' else 'N'  end,                       cast(p.value as varchar(4000))           from sys.columns c                   inner join #Tables t on t.object_id = c.object_id                   left outer join sys.extended_properties p on p.major_id = c.object_id and p.minor_id  = c.column_id and p.name = 'MS_Description'            where t.id = @i           order by c.column_id           end       Set @maxj =   @@rowcount       set @j = 1          print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Table Columns</b></td></tr></table>'        print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Datatype</th><th>Nullable</th><th>Description</th></tr>'               While(@j <= @maxj)       begin           select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'')  + '</td><td width="150px">' +  upper(isnull(Type,'')) + '</td><td width="50px" align="center">' + isnull(Nullable,'N') + '</td><td>' + isnull([description],'') + '</td></tr>'                from #Columns  where id = @j                      print   @Output                Set @j = @j + 1;       end          print '</table><br />'          --reference key       t@R_404_6143@ate table #FK       if @sqlVersion = '2000'            begin           insert into #FK  (Name,col,refObj,refCol)       --      FOR 2000           select object_name(constid),  object_name(rkeyid),  s1.name                     from sysforeignkeys f                       inner join sysobjects o on o.id = f.constid                       inner join syscolumns s on s.id = f.fkeyid and s.colorder = f.fkey                       inner join syscolumns s1 on s1.id = f.rkeyid and s1.colorder = f.rkey                       inner join #Tables t on t.object_id = f.fkeyid                   where t.id = @i                   order by 1           end        else if @sqlVersion = '2005'            begin           insert into #FK  (Name,refCol)   --      FOR 2005           select f.name,COL_NAME (fc.parent_object_id,fc.parent_column_id),object_name(fc.referenced_object_id),COL_NAME (fc.referenced_object_id,fc.referenced_column_id)                from sys.foreign_keys f               inner  join  sys.foreign_key_columns  fc  on f.object_id = fc.constraint_object_id                 inner join #Tables t on t.object_id = f.parent_object_id           where t.id = @i           order by f.name           end              Set @maxj =   @@rowcount       set @j = 1       if (@maxj >0)       begin              print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Refrence Keys</b></td></tr></table>'            print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Reference To</th></tr>'               While(@j <= @maxj)           begin                  select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'')  + '</td><td width="150px">' +  isnull(col,'') + '</td><td>[' + isnull(refObj,'N') + '].[' +  isnull(refCol,'N') + ']</td></tr>'                    from #FK  where id = @j                  print @Output               Set @j = @j + 1;           end              print '</table><br />'       end          --Default Constraints        t@R_404_6143@ate table #Constraint       if @sqlVersion = '2000'            begin           insert into #Constraint  (Name,deFinition)           select object_name(c.constid),col_name(c.id,c.colid),s.text                   from sysconstraints c                       inner join #Tables t on t.object_id = c.id                       left outer join syscomments s on s.id = c.constid                   where t.id = @i                    and                    convert(varchar,+ (c.status & 1)/1)                   + convert(varchar,(c.status & 2)/2)                   + convert(varchar,(c.status & 4)/4)                   + convert(varchar,(c.status & 8)/8)                   + convert(varchar,(c.status & 16)/16)                   + convert(varchar,(c.status & 32)/32)                   + convert(varchar,(c.status & 64)/64)                   + convert(varchar,(c.status & 128)/128) = '10101000'           end       else if @sqlVersion = '2005'            begin           insert into #Constraint  (Name,deFinition)           select c.name,  col_name(parent_object_id,parent_column_id),c.deFinition            from sys.default_constraints c               inner join #Tables t on t.object_id = c.parent_object_id           where t.id = @i           order by c.name           end       Set @maxj =   @@rowcount       set @j = 1       if (@maxj >0)       begin              print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Default Constraints</b></td></tr></table>'            print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Value</th></tr>'               While(@j <= @maxj)           begin                  select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="250px">' + isnull(name,'') + '</td><td>' +  isnull(deFinition,'') + '</td></tr>'                    from #Constraint  where id = @j                  print @Output               Set @j = @j + 1;           end          print '</table><br />'       end             --Check  Constraints       t@R_404_6143@ate table #Constraint       if @sqlVersion = '2000'            begin           insert into #Constraint  (Name,deFinition)               select object_name(c.constid),s.text                   from sysconstraints c                       inner join #Tables t on t.object_id = c.id                       left outer join syscomments s on s.id = c.constid                   where t.id = @i                    and ( convert(varchar,+ (c.status & 1)/1)                       + convert(varchar,(c.status & 2)/2)                       + convert(varchar,(c.status & 4)/4)                       + convert(varchar,(c.status & 8)/8)                       + convert(varchar,(c.status & 16)/16)                       + convert(varchar,(c.status & 32)/32)                       + convert(varchar,(c.status & 64)/64)                       + convert(varchar,(c.status & 128)/128) = '00101000'                    or convert(varchar,(c.status & 128)/128) = '00100100')              end       else if @sqlVersion = '2005'            begin           insert into #Constraint  (Name,deFinition)               select c.name,deFinition                from sys.check_constraints c                   inner join #Tables t on t.object_id = c.parent_object_id               where t.id = @i               order by c.name           end       Set @maxj =   @@rowcount              set @j = 1       if (@maxj >0)       begin              print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Check  Constraints</b></td></tr></table>'            print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>DeFinition</th></tr>'               While(@j <= @maxj)           begin                  select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="250px">' + isnull(name,'') + '</td></tr>'                    from #Constraint  where id = @j               print @Output                Set @j = @j + 1;           end              print '</table><br />'       end             --Triggers        t@R_404_6143@ate table #Constraint       if @sqlVersion = '2000'            begin           insert into #Constraint  (Name)               select tr.name               FROM sysobjects tr                   inner join #Tables t on t.object_id = tr.parent_obj               where t.id = @i and tr.type = 'TR'               order by tr.name           end       else if @sqlVersion = '2005'            begin           insert into #Constraint  (Name)               SELECT tr.name               FROM sys.triggers tr                   inner join #Tables t on t.object_id = tr.parent_id               where t.id = @i               order by tr.name           end       Set @maxj =   @@rowcount              set @j = 1       if (@maxj >0)       begin              print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Triggers</b></td></tr></table>'            print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Description</th></tr>'               While(@j <= @maxj)           begin               select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'')  + '</td><td></td></tr>'                    from #Constraint  where id = @j               print @Output                Set @j = @j + 1;           end              print '</table><br />'       end          --Indexes        t@R_404_6143@ate table #Indexes       if @sqlVersion = '2000'            begin           insert into #Indexes  (Name,type,cols)               select i.name,case when i.indid = 0 then 'Heap' when i.indid = 1 then 'Clustered' else 'Nonclustered' end,c.name                from sysindexes i                   inner join sysindexkeys k  on k.indid = i.indid  and k.id = i.id                   inner join syscolumns c on c.id = k.id and c.colorder = k.colid                   inner join #Tables t on t.object_id = i.id               where t.id = @i and i.name not like '_WA%'               order by i.name,i.keycnt           end       else if @sqlVersion = '2005'            begin           insert into #Indexes  (Name,case when i.type = 0 then 'Heap' when i.type = 1 then 'Clustered' else 'Nonclustered' end,  col_name(i.object_id,c.column_id)                   from sys.indexes i                        inner join sys.index_columns c on i.index_id = c.index_id and c.object_id = i.object_id                        inner join #Tables t on t.object_id = i.object_id                   where t.id = @i                   order by i.name,c.column_id           end          Set @maxj =   @@rowcount              set @j = 1       set @sr = 1       if (@maxj >0)       begin              print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Indexes</b></td></tr></table>'            print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Type</th><th>Columns</th></tr>'            set @Output = ''           set @last = ''           set @current = ''           While(@j <= @maxj)           begin               select @current = isnull(name,'') from #Indexes  where id = @j                                       if @last <> @current  and @last <> ''                   begin                      print '<tr><td width="20px" align="center">' + Cast((@sr) as varchar) + '</td><td width="150px">' + @last + '</td><td width="150px">' + @typ + '</td><td>' + @Output  + '</td></tr>'                    set @Output  = ''                   set @sr = @sr + 1                   end                                                 select @Output = @Output + cols + '<br />',@typ = type                       from #Indexes  where id = @j                              set @last = @current                   Set @j = @j + 1;           end           if @Output <> ''                   begin                      print '<tr><td width="20px" align="center">' + Cast((@sr) as varchar) + '</td><td width="150px">' + @last + '</td><td width="150px">' + @typ + '</td><td>' + @Output  + '</td></tr>'                    end              print '</table><br />'       end          Set @i = @i + 1;       --Print @Output    end         Print '</body>'   Print '</html>'      drop table #Tables   drop table #Columns   drop table #FK   drop table #Constraint   drop table #Indexes    set nocount off 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐