SQLServer テーブル定義の取得

テーブル定義情報を取得してHTMLに出力する

テーブル定義 取得用 SQL

lesson002.sql


select
c.table_name
, c.ordinal_position
, c.column_name
, c.data_type
, c.character_maximum_length
, c.numeric_precision
, c.numeric_precision_radix
, c.numeric_scale
, c.is_nullable
, c.column_default
, p.constraint_type
from
information_schema.columns c
left outer join
(
select
k.table_catalog
, k.table_schema
, k.table_name
, k.column_name
, t.constraint_type
from
information_schema.key_column_usage k
inner join
information_schema.table_constraints t
on
( t.constraint_name = k.constraint_name )
where
( t.constraint_type = 'primary key' )
)
p
on
( c.table_catalog = p.table_catalog )
and ( c.table_schema = p.table_schema )
and ( c.table_name = p.table_name )
and ( c.column_name = p.column_name )
order by
c.table_name
, c.ordinal_position

接続文字列

lesson002.con


DRIVER={SQL Server};SERVER=xxxxxx;DataBase=adventureworks;UID=yyyyyy;PWD=zzzzzz;

HTML出力用スクリプト

lesson003.vbs

Option Explicit

Private fs
Set fs = CreateObject("Scripting.FileSystemObject")

'接続文字列 読み込み
Private tsCon
Set tsCon = fs.OpenTextFile(WScript.Arguments(0))

Private sCon
sCon = ""
If Not tsCon.AtEndOfStream Then
    sCon = tsCon.ReadLine
End If
tsCon.Close
Set tsCon = Nothing

'接続
Private con
Set con = CreateObject("ADODB.Connection")
With con
    .Provider         = "SQLOLEDB"
    .ConnectionString = sCon
    .Open
End With

'SQL 読み込み
Private tsSql
Set tsSql = fs.OpenTextFile(WScript.Arguments(1))

Private sSql
sSql = ""
Do Until tsSql.AtEndOfStream
    sSql = sSql & tsSql.ReadLine & vbNewLine
Loop
tsSql.Close
Set tsSql = Nothing

'結果を HTML に保存
Private tsHtml
Set tsHtml = fs.OpenTextFile(WScript.Arguments(2), 2, True)  '2 = ForWriting

Dim rs
Set rs = CreateObject("ADODB.Recordset")
With rs
    .ActiveConnection = con
    .CursorType       = 0 'adOpenForwardOnly
    .LockType         = 1 'adLockReadOnly
    .Source           = sSql
    .Open
End With

If Not rs.EOF Then
    tsHtml.WriteLine "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"">"
    tsHtml.WriteLine "<html>"
    tsHtml.WriteLine "<body>"
    tsHtml.WriteLine "    <table border>"

    tsHtml.WriteLine "        <tr>"
    tsHtml.Write     "            "
    Dim i
    For i = 0 To rs.Fields.Count - 1
        tsHtml.Write "<th>" & rs.Fields(i).Name & "</th>"
    Next
    tsHtml.WriteLine ""
    tsHtml.WriteLine "        </tr>"

    Do Until rs.EOF
        tsHtml.WriteLine "        <tr>"
        tsHtml.Write     "            "
        For i = 0 To rs.Fields.Count - 1
            tsHtml.Write "<td>" & rs.Fields(i).Value & "</td>"
        Next
        tsHtml.WriteLine ""
        tsHtml.WriteLine "        </tr>"

        rs.MoveNext
    Loop

    tsHtml.WriteLine "    </table>"
    tsHtml.WriteLine "</body>"
    tsHtml.WriteLine "</html>"
End If
rs.Close

tsHtml.Close
Set tsHtml = Nothing
Set fs = Nothing

'切断
con.Close
Set con = Nothing
実行形式


C:\>cscript c:\study\vbscript\chapter006\lesson003.vbs c:\study\vbscript\chapte
r006\lesson002.con c:\study\vbscript\chapter006\lesson002.sql c:\study\vbscript\
chapter006\lesson003.html //nologo

出力結果

lesson003.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
    <table border>
        <tr>
            <th>table_name</th><th>ordinal_position</th><th>column_name</th><th>data_type</th><th>character_maximum_length</th><th>numeric_precision</th><th>numeric_precision_radix</th><th>numeric_scale</th><th>is_nullable</th><th>column_default</th><th>constraint_type</th>
        </tr>
        <tr>
            <td>Address</td><td>1</td><td>AddressID</td><td>int</td><td></td><td>10</td><td>10</td><td>0</td><td>NO</td><td></td><td>PRIMARY KEY</td>
        </tr>
        <tr>
            <td>Address</td><td>2</td><td>AddressLine1</td><td>nvarchar</td><td>60</td><td></td><td></td><td></td><td>NO</td><td></td><td></td>
        </tr>
        <tr>
            <td>Address</td><td>3</td><td>AddressLine2</td><td>nvarchar</td><td>60</td><td></td><td></td><td></td><td>YES</td><td></td><td></td>
        </tr>
        <tr>
            <td>Address</td><td>4</td><td>City</td><td>nvarchar</td><td>30</td><td></td><td></td><td></td><td>NO</td><td></td><td></td>
        </tr>
        <tr>
            <td>Address</td><td>5</td><td>StateProvinceID</td><td>int</td><td></td><td>10</td><td>10</td><td>0</td><td>NO</td><td></td><td></td>
        </tr>
        <tr>
            <td>Address</td><td>6</td><td>PostalCode</td><td>nvarchar</td><td>15</td><td></td><td></td><td></td><td>NO</td><td></td><td></td>
        </tr>
        <tr>
            <td>Address</td><td>7</td><td>rowguid</td><td>uniqueidentifier</td><td></td><td></td><td></td><td></td><td>NO</td><td>(newid())</td><td></td>
        </tr>
        <tr>
            <td>Address</td><td>8</td><td>ModifiedDate</td><td>datetime</td><td></td><td></td><td></td><td></td><td>NO</td><td>(getdate())</td><td></td>
        </tr>
        <tr>
            <td>AddressType</td><td>1</td><td>AddressTypeID</td><td>int</td><td></td><td>10</td><td>10</td><td>0</td><td>NO</td><td></td><td>PRIMARY KEY</td>
        </tr>
        <tr>
            <td>AddressType</td><td>2</td><td>Name</td><td>nvarchar</td><td>50</td><td></td><td></td><td></td><td>NO</td><td></td><td></td>
        </tr>
    </table>
</body>
</html>
出力イメージ

lesson003.html

table_nameordinal_positioncolumn_namedata_typecharacter_maximum_lengthnumeric_precisionnumeric_precision_radixnumeric_scaleis_nullablecolumn_defaultconstraint_type
Address1AddressIDint10100NOPRIMARY KEY
Address2AddressLine1nvarchar60NO
Address3AddressLine2nvarchar60YES
Address4Citynvarchar30NO
Address5StateProvinceIDint10100NO
Address6PostalCodenvarchar15NO
Address7rowguiduniqueidentifierNO(newid())
Address8ModifiedDatedatetimeNO(getdate())
AddressType1AddressTypeIDint10100NOPRIMARY KEY
AddressType2Namenvarchar50NO