sql >> Database >  >> RDS >> Sqlserver

Primaire sleutelbeperking aan identiteitskolommen toevoegen aan alle tabellen in SQL Server-database - SQL Server / TSQL-zelfstudie, deel 63

Scenario:

Je werkt als SQL Server ontwikkelaar. U hebt deze vereiste waarin u een primaire sleutelbeperking moet maken voor alle identiteitskolommen in alle tabellen in de SQL Server-database als deze niet bestaat.
De naam van de primaire sleutel moet Pk_SchemaName_TableName_ColumnName zijn.

Oplossing:

Allereerst moeten we de lijst met tabellen ophalen met een identiteitskolom en er is geen primaire sleutelbeperking op gemaakt. we zullen systeemtabellen en systeemweergaven gebruiken om alle tabellen te krijgen met identiteitskolommen die geen primaire sleutelbeperkingen hebben.
Vervolgens gaan we de cursor gebruiken met dynamische SQL om een ​​Alter-instructie voor de tabel te genereren om de primaire sleutelbeperking toe te voegen en het script uit te voeren.
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
 
 
 
 
 Als u alleen de alter-statements wilt genereren voor het toevoegen van Primary Key Constraint, kunt u commentaar toevoegen aan het Exec(@SQL)-gedeelte. Het bovenstaande script zal Alter-statements afdrukken en u kunt het op uw gemak uitvoeren.
Ook als u dat niet doet Als u het gedeelte Schemanaam niet wilt toevoegen aan de beperking van de primaire sleutel, kunt u @SchemaName verwijderen.
Ik heb bovenstaande query uitgevoerd en het heeft de primaire sleutelbeperking op identiteitskolommen gemaakt waar deze ontbrak. Wijzig scripts gegenereerd door script om primaire sleutelbeperking toe te voegen aan identiteitskolommen

Ik heb geverifieerd de tabellen en Primary Key Constraints zijn gemaakt. Primaire sleutelbeperking maken voor identiteitskolommen in SQL Server-database
  1. Fout bij het toewijzen van postgres-arrays in Spring JPA

  2. Geef waarden door die uit een bestand zijn gelezen als invoer voor een SQL-query in Oracle

  3. Hoe verwijder ik vaste spaties uit een kolom in SQL Server?

  4. De Aria Storage Engine gebruiken met MariaDB Server