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

SQLServerデータベースのすべてのテーブルのID列に主キー制約を追加する方法-SQLServer/TSQLチュートリアルパート63

    シナリオ:

    あなたはSQLServer開発者として働いています。存在しない場合は、SQLServerデータベースのすべてのテーブルのすべてのID列に主キー制約を作成する必要があるというこの要件があります。
    主キー名はPk_SchemaName_TableName_ColumnNameである必要があります。

    解決策:

    まず、ID列があり、主キー制約が作成されていないテーブルのリストを取得する必要があります。システムテーブルとシステムビューを使用して、主キー制約のないID列を持つすべてのテーブルを取得します。
    次に、動的SQLでCursorを使用して、テーブルのAlterステートメントを生成し、主キー制約を追加してスクリプトを実行します。
    USE YourDatabaseName
    GO
    
    --Declare Variables
    DECLARE @DatabaseName AS VARCHAR(128)
    DECLARE @SchemaName AS VARCHAR(128)
    DECLARE @TableName AS VARCHAR(128)
    DECLARE @ColumnName AS VARCHAR(128)
    
    DECLARE CUR CURSOR
    FOR
    --Get list of tables with Identity Column
    --on which have no Primary Key
    SELECT DB_Name() AS DatabaseName
        ,Schema_Name(Schema_id) AS TableSchema
        ,OBJECT_NAME(c.OBJECT_ID) AS TableName
        ,c.NAME AS ColumnName
    FROM sys.columns c
    INNER JOIN sys.tables t ON c.object_id = t.object_id
    WHERE is_identity = 1
        AND type_desc = 'USER_TABLE'
    
    EXCEPT
    
    SELECT TC.Table_Catalog AS DatabaseName
        ,TC.Table_Schema AS TableSchema
        ,TC.Table_Name AS TableName
        ,CCU.Column_Name AS ColumnName
    FROM information_Schema.Table_Constraints TC
    INNER JOIN Information_Schema.constraint_column_usage CCU 
    ON TC.Constraint_Name = CCU.Constraint_Name
        AND TC.Table_Name = CCU.Table_Name
    WHERE Constraint_Type = 'PRIMARY KEY'
    
    OPEN Cur
    
    FETCH NEXT
    FROM Cur
    INTO @DatabaseName
        ,@SchemaName
        ,@TableName
        ,@ColumnName
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        --Build dynamic sql for each database 
        DECLARE @SQL VARCHAR(MAX) = NULL
    
        SET @SQL = 'Alter Table [' + @SchemaName + '].[' + @TableName + ']' + CHAR(10)
        SET @SQL += 'Add Constraint [Pk_' + @SchemaName 
    + '_' + @TableName 
                 + '_' + @ColumnName + '] '
        SET @SQL += 'Primary Key ([' + @ColumnName + '])'
    
        EXEC (@SQL)
    
        PRINT @SQL
    
        FETCH NEXT
        FROM Cur
        INTO @DatabaseName
            ,@SchemaName
            ,@TableName
            ,@ColumnName
    END
    
    CLOSE Cur
    
    DEALLOCATE Cur
     
     
     
     
     主キー制約を追加するためのalterステートメントを生成するだけの場合は、Exec(@SQL)部分にコメントを追加できます。上記のスクリプトはAlterステートメントを出力し、都合の良いときに実行できます。
    また、主キー制約にスキーマ名の部分を追加したくない場合は、@ SchemaNameを削除できます。
    上記のクエリを実行すると、欠落しているID列に主キー制約が作成されました。 主キー制約をID列に追加するためにスクリプトによって生成されたスクリプトを変更する

    確認しましたテーブルと主キー制約が正常に作成されました。 SQLServerデータベースのID列に主キー制約を作成する方法
    1. ContentDocumentをSalesforceカスタムオブジェクトに添付する

    2. Oracleの文字列連結演算子とは何ですか?

    3. PentahoDataIntegrationおよびBAServerツールへのMicrosoftSQLServerJDBCドライバーのインストール

    4. ツリー構造用に最適化されたSQL