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 identiteitskolommenIk heb geverifieerd de tabellen en Primary Key Constraints zijn gemaakt.
Primaire sleutelbeperking maken voor identiteitskolommen in SQL Server-database