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