Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come aggiungere il vincolo della chiave primaria alle colonne di identità a tutte le tabelle nel database di SQL Server - Tutorial di SQL Server / TSQL Parte 63

Scenario:

Stai lavorando come sviluppatore di SQL Server. Hai questo requisito in cui devi creare il vincolo della chiave primaria su tutte le colonne di identità su tutte le tabelle nel database di SQL Server se non esiste.
Il nome della chiave primaria dovrebbe essere Pk_SchemaName_TableName_ColumnName.

Soluzione:

Prima di tutto abbiamo bisogno di ottenere l'elenco delle tabelle che hanno una colonna di identità e il vincolo della chiave primaria non è stato creato su di esse. useremo le tabelle di sistema e le viste di sistema per ottenere tutte le tabelle con colonne di identità che non hanno vincoli di chiave primaria.
Quindi useremo il cursore con SQL dinamico per generare l'istruzione Alter per la tabella per aggiungere il vincolo della chiave primaria ed eseguire lo script.
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
 
 
 
 
 Se ti piace generare semplicemente le istruzioni alter per aggiungere il vincolo della chiave primaria, puoi aggiungere un commento alla parte Exec(@SQL). Lo script sopra stamperà le istruzioni Alter e potrai eseguirle a tuo piacimento.
Anche se non lo fai Non mi piace aggiungere la parte del nome dello schema al vincolo della chiave primaria, puoi rimuovere @SchemaName.
Ho eseguito la query precedente e ha creato il vincolo della chiave primaria sulle colonne di identità dove mancava. Alterare gli script generati dallo script per aggiungere il vincolo della chiave primaria alle colonne di identità

Ho verificato le tabelle e i vincoli della chiave primaria sono stati creati correttamente. Come creare un vincolo di chiave primaria su colonne di identità nel database di SQL ServerSQL Server