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

Come ottenere l'elenco dei vincoli della chiave primaria da tutti i database sull'istanza di SQL Server - Tutorial di SQL Server / TSQL Parte 60

Scenario:

Si sta lavorando sulla documentazione degli oggetti di database e viene chiesto di fornire l'elenco di tutti i vincoli di chiave primaria su tutte le tabelle di database sull'intera istanza di SQL Server. Come forniresti l'elenco di tutti i vincoli di chiave primaria con Nome database, Nome schema, Nome tabella, Nome colonna, Nome vincolo?

Soluzione:

Utilizzeremo le viste di sistema per ottenere le informazioni sui vincoli della chiave primaria. Poiché è necessario eseguire la query su tutto il database, utilizzeremo Cursor con sql dinamico. Per ogni database, inseriremo i risultati nella tabella temporanea e infine selezioneremo il risultato alla fine dalla tabella temporanea per la visualizzazione.

USE master
GO
--Declare Variables
DECLARE @DatabaseName AS VARCHAR(500)
--Create Temp Table to Save Results
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results
CREATE TABLE #Results (
    ServerName VARCHAR(128)
    ,DatabaseName VARCHAR(128)
    ,SchemaName VARCHAR(128)
    ,TableName VARCHAR(128)
    ,ColumnName VARCHAR(128)
    ,ConstraintName VARCHAR(128)
    )
DECLARE CUR CURSOR
FOR
SELECT '[' + NAME + ']' AS DBName
FROM sys.databases
WHERE NAME NOT IN (
        'master'
        ,'tempdb'
        ,'model'
        ,'msdb'
        )
OPEN Cur
FETCH NEXT
FROM Cur
INTO @DatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
    --Build dynamic sql for each database 
    DECLARE @SQL VARCHAR(MAX) = NULL
    SET @SQL = 'Insert into #Results
      Select
      @@ServerName,
   TC.Table_Catalog as DatabaseName,
   TC.Table_Schema AS TableSchema,
   TC.Table_Name AS TableName,
   CCU.Column_Name AS ColumnName,
   TC.Constraint_Name AS ConstraintName 
From' + @DatabaseName + '.information_Schema.Table_Constraints TC  
INNER JOIN
   ' + @DatabaseName + 
'.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'''
    EXEC (@SQL)
    PRINT @SQL
    FETCH NEXT
    FROM Cur
    INTO @DatabaseName
END
CLOSE Cur
DEALLOCATE Cur
--Select all records from temp table for Primary Key 
--Constraint Information
SELECT *
FROM #Results



Eseguo la query precedente sulla mia istanza di SQL Server e ho ottenuto l'elenco di tutti i vincoli della chiave primaria con il nome del database, il nome dello schema, il nome della tabella, il nome della colonna e il nome del vincolo come mostrato di seguito.
Come ottenere l'elenco di tutti i vincoli della chiave primaria da ogni database dall'istanza di SQL Server - SQL Server / Esercitazione T-SQL