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

SQLServerインスタンスからすべてのデータベースの主キー制約がある場合とない場合のテーブルのリストを取得する-SQLServer/TSQLチュートリアルパート61

    シナリオ:

    あなたは保険会社のSQLServer開発者/SQLServerDBAとして働いています。データベースオブジェクトのドキュメントを作成しています。主キーの制約なしで、SQLServerインスタンスのすべてのデータベースからすべてのテーブルのリストを取得する必要があります。


    解決策:

    システムビューを使用して、各データベースからの主キー制約のあるテーブルまたはないテーブルのリストを作成できます。この情報を収集するには各データベースでクエリを実行する必要があるため、ユーザーデータベースのリストをループする必要があります。カーソルを使用して、SQLServerインスタンス上のすべてのデータベースをループします。データベースごとに動的SQLを作成し、結果を一時テーブルに保存して、最後に表示するレコードを選択します。
    USE master
    GO
    
    --Declare Variables
    DECLARE @DatabaseName AS VARCHAR(500)
    
    --Create Temp Table to Save Results
    IF OBJECT_ID('tempdb..#Results') IS NOT NULL
        DROP TABLE #Results
    
    CREATE TABLE #Results (
        ServerName VARCHAR(128)
        ,DatabaseName VARCHAR(128)
        ,SchemaName VARCHAR(128)
        ,TableName VARCHAR(128)
        ,ColumnName VARCHAR(128)
        ,ConstraintName VARCHAR(128)
        ,HasPrimaryKeyConstraint VARCHAR(10)
        )
    
    DECLARE CUR CURSOR
    FOR
    SELECT '[' + NAME + ']' AS DBName
    FROM sys.databases
    WHERE NAME NOT IN (
            'master'
            ,'tempdb'
            ,'model'
            ,'msdb'
            )
    
    OPEN Cur
    
    FETCH NEXT
    FROM Cur
    INTO @DatabaseName
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        --Build dynamic sql for each database 
        DECLARE @SQL VARCHAR(MAX) = NULL
    
        SET @SQL = 'Insert into #Results
          Select
          @@ServerName,
       T.Table_Catalog as DatabaseName,
       T.Table_Schema AS TableSchema,
       T.Table_Name AS TableName,
       CCU.Column_Name AS ColumnName,
       TC.Constraint_Name AS ConstraintName,
       Case When  TC.Constraint_Name is not Null Then ''Yes''
       Else ''No'' End as HasPrimaryKeyConstraint
    From
    ' + @DatabaseName + '.information_schema.tables T
    left join 
    
       ' + @DatabaseName + '.information_Schema.Table_Constraints TC 
       on T.Table_Catalog=TC.Table_Catalog
       and T.Table_Schema=TC.Table_Schema
       and T.Table_Name=TC.Table_Name
       and TC.Constraint_Type=''PRIMARY KEY''
       
    left JOIN
       ' + @DatabaseName + 
    '.Information_Schema.constraint_column_usage CCU  
          on TC.Constraint_Name=CCU.Constraint_Name  
          and TC.Table_Name=CCU.Table_Name
          and T.Table_Type=''BASE TABLE'''
    
        EXEC (@SQL)
    
        PRINT @SQL
    
        FETCH NEXT
        FROM Cur
        INTO @DatabaseName
    END
    
    CLOSE Cur
    
    DEALLOCATE Cur
    
    --Select all records from temp table 
    SELECT *
    FROM #Results
     
     
     SQL Serverインスタンスで上記のクエリを実行します。これは、利用可能な場合は主キー制約があり、それ以外の場合はNullであるすべてのデータベースのテーブルのリストです。 SQLServerインスタンスからすべてのデータベースで主キー制約の有無にかかわらずすべてのテーブルを取得する方法-SQLServer /TSQLチュートリアル



    1. 日付範囲から日を生成する

    2. データベースとは何ですか?そしてDBMS?

    3. Toadにストアドプロシージャを呼び出す

    4. ORA-01460:実装されていない、または不当な変換が要求されました