sql >> データベース >  >> RDS >> Sqlserver

SQL Server でオブジェクトを検索する (クロスデータベース)

    INFORMATION_SCHEMA というスキーマがあります 必要なものを取得するために照会できる SYS スキーマからのテーブルのビューのセットを含むスキーマ。

    INFORMATION_SCHEMA の大きな利点 オブジェクト名が非常にクエリしやすく、ユーザーが読みやすいことです。 INFORMATION_SCHEMA の欠点 オブジェクトの種類ごとに 1 つのクエリを作成する必要があります。

    Sys スキーマは最初は少し分かりにくいように見えるかもしれませんが、同じ情報 (およびそれ以上) がすべて 1 つの場所に含まれています。

    すべてのオブジェクトの名前とそのタイプを含む SysObjects というテーブル (各データベースに 1 つあります) から始めます。

    次のようにデータベースを検索できます:

    Select [name] as ObjectName, Type as ObjectType
    From Sys.Objects
    Where 1=1
        and [Name] like '%YourObjectName%'
    

    ここで、テーブルとストアド プロシージャのみを検索するようにこれを制限したい場合は、そうします

    Select [name] as ObjectName, Type as ObjectType
    From Sys.Objects
    Where 1=1
        and [Name] like '%YourObjectName%'
        and Type in ('U', 'P')
    

    オブジェクト タイプを調べると、ビュー、トリガーなどの完全なリストが見つかります。

    各データベースでこれを検索する場合は、データベースを反復処理する必要があります。次のいずれかを行うことができます:

    句を使用せずに各データベースを検索する場合は、こちらの回答に示されているように sp_MSforeachdb を使用してください。

    特定のデータベースのみを検索する場合は、「USE DBName」を使用してから検索コマンドを使用します。

    その場合、パラメータ化することで大きなメリットが得られます。検索するデータベースの名前は、各クエリ (DatabaseOne、DatabaseTwo...) で置き換える必要があることに注意してください。これをチェックしてください:

    Declare @ObjectName VarChar (100)
    
    Set @ObjectName = '%Customer%'
    
    Select 'DatabaseOne' as DatabaseName, [name] as ObjectName, Type as ObjectType
    From DatabaseOne.Sys.Objects
    Where 1=1
        and [Name] like @ObjectName
        and Type in ('U', 'P')
    
    UNION ALL
    
    Select 'DatabaseTwo' as DatabaseName, [name] as ObjectName, Type as ObjectType
    From DatabaseTwo.Sys.Objects
    Where 1=1
        and [Name] like @ObjectName
        and Type in ('U', 'P')
    
    UNION ALL
    
    Select 'DatabaseThree' as DatabaseName, [name] as ObjectName, Type as ObjectType
    From DatabaseThree.Sys.Objects
    Where 1=1
        and [Name] like @ObjectName
        and Type in ('U', 'P')
    


    1. MySQL、PostgreSQL、SQLiteで結果を制限する方法

    2. インデックスが存在しない場合に追加された最新の行を特定する

    3. mysql全文検索エラー

    4. PostgreSQLUUIDタイプのパフォーマンス