개발/ MSSQL / / 2019. 1. 16. 20:04

[MSSQL] 테이블 명세서 생성 스크립트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
--//SQL Database documentation script
--//Author: Nitin Patel, Email: nitinpatel31@gmail.com
--//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(11), Object_id int, Name varchar(155), Type varchar(20), [description] varchar(4000))
create Table #Columns (id int identity(1,1), Name varchar(155), Type Varchar(155), Nullable varchar(2), [description] varchar(4000))
create Table #Fk(id int identity(1,1), Name varchar(155), col Varchar(155), refObj varchar(155), refCol varchar(155))
create Table #Constraint(id int identity(1,1), Name varchar(155), col Varchar(155), definition varchar(1000))
create Table #Indexes(id int identity(1,1), Name varchar(155), Type Varchar(25), cols varchar(1000))
 
If (substring(@@VERSION, 125 ) = 'Microsoft SQL Server 2005')
     set @SqlVersion = '2005'
else if (substring(@@VERSION, 126 ) = '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 information_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, Name, Type, [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
     truncate table #Columns
     if @SqlVersion = '2000'
          begin
          insert into #Columns  (Name, Type, 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, Type, Nullable, [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+ ',' + cast(scale as varchar)   + ')'
                         else ''
                         end                   
                         ),
                         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
     truncate table #FK
     if @SqlVersion = '2000'
          begin
          insert into #FK  (Name, col, refObj, refCol)
     --          FOR 2000
          select object_name(constid), s.name,  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, col, refObj, 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
     truncate table #Constraint
     if @SqlVersion = '2000'
          begin
          insert into #Constraint  (Name, col, 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, col, 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 width="150px">' +  isnull(col,''+ '</td><td>' +  isnull(definition,''+ '</td></tr>'
                    from #Constraint  where id = @j
 
               print @Output
               Set @j = @j + 1;
          end
 
     print '</table><br />'
     end
 
 
     --Check  Constraints
     truncate table #Constraint
     if @SqlVersion = '2000'
          begin
          insert into #Constraint  (Name, col, 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= '00101000'
                    or 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= '00100100')
 
          end
     else if @SqlVersion = '2005'
          begin
          insert into #Constraint  (Name, col, definition)
               select c.name,  col_name(parent_object_id, parent_column_id), 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><td width="150px">' +  isnull(col,''+ '</td><td>' +  isnull(definition,''+ '</td></tr>'
                    from #Constraint  where id = @j
               print @Output
               Set @j = @j + 1;
          end
 
          print '</table><br />'
     end
 
 
     --Triggers
     truncate 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
     truncate 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, type, cols)
               select i.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
cs

 

'개발 > MSSQL' 카테고리의 다른 글

[MSSQL] 파일 데이터 넣기  (0) 2019.01.16
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유