Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

テーブル定義取得クエリ

適当にカスタマイズして、テーブル定義書の作成等にお使いください。

対応バージョン

SQL Server 2005, 2008 R2で動作確認済み。2008でも動くと思います。

テーブル、ビューの一覧

SELECT
    TABLE_CATALOG
    ,TABLE_SCHEMA
    ,TABLE_NAME
    ,TABLE_TYPE
FROM
    INFORMATION_SCHEMA.TABLES
ORDER BY
    TABLE_SCHEMA
    ,TABLE_NAME
    ,TABLE_TYPE

テーブル定義

クエリ先頭のデータベース名、スキーマ名、テーブル名を変更してください。(Nullにすると条件なしになります)

DECLARE
@DatabaseName   nvarchar(max)
,@SchemaName    nvarchar(max)
,@TableName     nvarchar(max)

/*
 * ここを変更する
 */
SELECT @DatabaseName    = 'AdventureWorksLT2008R2'
SELECT @SchemaName      = 'SalesLT'
SELECT @TableName       = 'Address'

SELECT
    DatabaseName            = C.TABLE_CATALOG
    ,SchemaName             = C.TABLE_SCHEMA
    ,TableName              = C.TABLE_NAME
    ,TableObjectID          = OBJECT_ID(C.TABLE_SCHEMA + '.' + C.TABLE_NAME)
    ,ColumnID               = COLUMNPROPERTY(OBJECT_ID(C.TABLE_SCHEMA + '.' + C.TABLE_NAME), C.COLUMN_NAME, 'ColumnID')
    ,OrdinalPosition        = C.ORDINAL_POSITION
    ,ColumnName             = C.COLUMN_NAME
    ,DataType               = C.DATA_TYPE
    ,MaximumLength          = C.CHARACTER_OCTET_LENGTH
    ,NumericPrecision       = C.NUMERIC_PRECISION
    ,NumericScale           = C.NUMERIC_SCALE
    ,NumericPrecision表示用 = CONVERT(varchar, C.NUMERIC_PRECISION) + '(' + CONVERT(varchar, C.NUMERIC_SCALE) + ')'
    ,IsNullable             = C.IS_NULLABLE
    ,NotNull表示用          = 
    CASE
        WHEN C.IS_NULLABLE  = 'YES'   THEN '○'
        WHEN C.IS_NULLABLE  = 'NO'    THEN ''
        ELSE 'Undefined'
    END
    ,[Default]              = SUBSTRING(C.COLUMN_DEFAULT, 2, LEN(C.COLUMN_DEFAULT) - 2)    -- 両端のカッコを削除
    ,IdentitySeed           = i.seed_value
    ,IdentityIncrement      = i.increment_value
    ,Identity表示用         = CONVERT(varchar, i.seed_value) + '(' + CONVERT(varchar, i.increment_value) + ')'
FROM
    INFORMATION_SCHEMA.COLUMNS C
    LEFT OUTER JOIN sys.identity_columns i
ON
    OBJECT_ID(C.TABLE_SCHEMA + '.' + C.TABLE_NAME) = i.object_id
    AND C.COLUMN_NAME = I.name
WHERE
    (
        C.TABLE_CATALOG = @DatabaseName OR (@DatabaseName IS NULL)
    ) AND (
        C.TABLE_SCHEMA = @SchemaName OR (@SchemaName IS NULL)
    ) AND (
        C.TABLE_NAME = @TableName OR (@TableName IS NULL)
    )
ORDER BY
    C.TABLE_CATALOG
    ,C.TABLE_SCHEMA
    ,C.TABLE_NAME
    ,C.ORDINAL_POSITION

参考にしたサイト

メモ帳: [SQL Server 2005] SQL Serverでテーブル定義取得
SQL Server 2005で、テーブル定義らしいものを取得するクエリです。 これを使って、テーブル定義書を自動生成させてます。 ...

SQL Server システム カタログに対するクエリに関してよく寄せられる質問
このトピックでは、よく寄せられる質問の一覧を掲載しています。 これらの質問に対する答えは、カタログ ビューに基づくクエリです。 ...