SQLServer > オブジェクト抽出SQLまとめ

2016-10-06 20:27:38 (Thu);

オブジェクト抽出SQLまとめ


設計や移行等で何かと利用するSQLメモ




全てのテーブルのカウントSQLを作成。 最後の union all だけ消して使う。
select 'select ''' + name + ''',count(*) from ' + name + ' union all'
from sys.sysobjects
where xtype = 'U'
order by name


カラムの定義情報を取得
Thanks. devlights.hatenablog.com/entry/20090911/p1
※素晴らしい出来なのでお借りしました。
SELECT
     DB_NAME()                                                                 AS db_name
    ,SCHEMA_NAME(tables.schema_id)                                             AS schema_name
    ,tables.name                                                               AS table_name
    ,columns.name                                                              AS column_name
    ,columns.column_id                                                         AS ordinal_position
    ,CAST(CASE WHEN pk_cols.key_ordinal IS NOT NULL THEN 1  ELSE 0 END AS bit) AS is_primary_key
    ,pk_cols.constraint_name                                                   AS pk_constraint_name
    ,pk_cols.key_ordinal                                                       AS pk_key_ordinal
    ,CAST(CASE WHEN uq_cols.key_ordinal IS NOT NULL THEN 1 ELSE 0 END AS bit)  AS is_unique_key
    ,uq_cols.constraint_name                                                   AS uq_constraint_name
    ,uq_cols.key_ordinal                                                       AS uq_key_ordinal
    ,TYPE_NAME(columns.system_type_id)                                         AS column_data_type
    ,defaultConstraints.definition                                             AS column_default
    ,columns.is_nullable                                                       AS is_nullable
    ,extProp.value                                                             AS column_comment
    ,CASE
         WHEN TYPE_NAME(columns.system_type_id) IN ('int', 'tinyint','bigint','smalldatetime','datetime2','bit') THEN NULL
         WHEN TYPE_NAME(columns.system_type_id) IN ('nvarchar', 'nchar') THEN columns.max_length / 2
         WHEN columns.precision = 0 THEN columns.max_length
         ELSE columns.precision END                                            AS max_length
    ,CASE WHEN columns.scale = 0 THEN NULL ELSE columns.scale END              AS scale
    ,columns.max_length                                                        AS byte_size
    ,columns.collation_name                                                    AS collation_name
FROM
    sys.tables tables
        INNER JOIN sys.columns columns
        ON
            tables.object_id = columns.object_id
        /* DEFAULT制約定義を取得する為に以下の二つのテーブルを外部結合 */
        LEFT OUTER JOIN sys.sysconstraints constraints
        ON
                columns.object_id = constraints.id
            AND columns.column_id = constraints.colid
            /* DEFAULT制約を表す疑似ビットマスク値 (マスクしていないと取得できない場合があるとのこと. (thanks murasukeさん) */
            AND (constraints.status & 2069) = 2069               
        LEFT OUTER JOIN sys.default_constraints defaultConstraints
        ON
                constraints.constid = defaultConstraints.object_id
            AND tables.schema_id    = defaultConstraints.schema_id
        /* コメントデータは拡張プロパティシステムビューに存在する */
        LEFT OUTER JOIN sys.extended_properties extProp
        ON
            /* カラムの場合、classの値は常に1 (OBJECT_OR_COLUMN) */
                extProp.class = 1
            AND columns.object_id = extProp.major_id
            AND columns.column_id = extProp.minor_id
        /* プライマリーキーの情報を取得する為に以下の情報を外部結合 */
        LEFT OUTER JOIN (
            SELECT
                 key_const.name       AS constraint_name
                ,idx_cols.key_ordinal AS key_ordinal
                ,cols.name            AS col_name
                ,cols.object_id       AS col_object_id
                ,cols.column_id       AS col_column_id
            FROM
                sys.tables tbls
                    /* PKの情報を結合 */
                    INNER JOIN sys.key_constraints key_const
                    ON
                            tbls.object_id = key_const.parent_object_id
                        AND key_const.type = 'PK'
                    /* 対応するインデックス情報からカラムと特定 */
                    INNER JOIN sys.index_columns idx_cols
                    ON
                            key_const.parent_object_id = idx_cols.object_id
                        AND key_const.unique_index_id  = idx_cols.index_id
                    INNER JOIN sys.columns cols
                    ON
                            idx_cols.object_id = cols.object_id
                        AND idx_cols.column_id = cols.column_id
        ) pk_cols
        ON
                columns.object_id = pk_cols.col_object_id
            AND columns.column_id = pk_cols.col_column_id
        /* ユニークキーの情報を取得する為に以下の情報を外部結合 */
        LEFT OUTER JOIN (
            SELECT
                 key_const.name       AS constraint_name
                ,idx_cols.key_ordinal AS key_ordinal
                ,cols.name            AS col_name
                ,cols.object_id       AS col_object_id
                ,cols.column_id       AS col_column_id
            FROM
                sys.tables tbls
                    /* UQ(ユニークキー)の情報を結合 */
                    INNER JOIN sys.key_constraints key_const
                    ON
                            tbls.object_id = key_const.parent_object_id
                        AND key_const.type = 'UQ'
                    /* 対応するインデックス情報からカラムと特定 */
                    INNER JOIN sys.index_columns idx_cols
                    ON
                            key_const.parent_object_id = idx_cols.object_id
                        AND key_const.unique_index_id  = idx_cols.index_id
                    INNER JOIN sys.columns cols
                    ON
                            idx_cols.object_id = cols.object_id
                        AND idx_cols.column_id = cols.column_id
        ) uq_cols
        ON
                columns.object_id = uq_cols.col_object_id
            AND columns.column_id = uq_cols.col_column_id
ORDER BY
    db_name, schema_name, table_name, columns.column_id

プライマリーキー、ユニークキー一覧
SELECT
     tbls.name            AS table_name
    ,key_const.type       AS key_type
    ,key_const.name       AS constraint_name
    ,idx_cols.key_ordinal AS key_ordinal
    ,cols.name            AS col_name
FROM
    sys.tables tbls
    INNER JOIN sys.key_constraints key_const
		ON  tbls.object_id = key_const.parent_object_id
	INNER JOIN sys.index_columns idx_cols
        ON  key_const.parent_object_id = idx_cols.object_id
        AND key_const.unique_index_id  = idx_cols.index_id
    INNER JOIN sys.columns cols
        ON  idx_cols.object_id = cols.object_id
        AND idx_cols.column_id = cols.column_id
WHERE
	key_const.type in ('PK','UK')
ORDER BY
    tbls.object_id, idx_cols.key_ordinal, idx_cols.column_id


全インデックス
SELECT
    idx.name  AS index_name
    ,obj.name AS table_name
    ,col.name AS column_name
FROM
    sysindexkeys keys
    INNER JOIN sysobjects obj
        ON keys.id = obj.id
    INNER JOIN syscolumns col
        ON keys.id = col.id
       AND keys.colid = col.colid
    INNER JOIN sysindexes idx
        ON keys.id = idx.id
       AND keys.indid = idx.indid
WHERE
    obj.xtype = 'U'
ORDER BY
    idx.name
    ,keys.id
    ,keys.indid
    ,keys.keyno


外部キー一覧
SELECT
   name
   , OBJECT_NAME(parent_object_id) parent_object_id
   , OBJECT_NAME(referenced_object_id) referenced_object_id
FROM
   sys.foreign_keys



最終更新:2016年10月06日 20:27