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

Ottieni l'elenco delle tabelle con o senza vincolo della chiave primaria in tutti i database dall'istanza di SQL Server - Tutorial SQL Server/TSQL Parte 61

Scenario:

Lavori come sviluppatore SQL Server / DBA SQL Server per compagnia assicurativa. Stai creando documentazione per oggetti di database. È necessario ottenere l'elenco di tutte le tabelle da tutto il database dall'istanza di SQL Server senza vincoli di chiave primaria.


Soluzione:

Possiamo utilizzare le viste di sistema per elencare le tabelle con Vincolo della chiave primaria o meno da ciascun database. Poiché la query deve essere eseguita su ciascuno dei database per raccogliere queste informazioni, è necessario scorrere l'elenco dei database utente, utilizzeremo il cursore per eseguire il ciclo di tutti i database sull'istanza di SQL Server. Costruiremo il nostro sql dinamico per ogni database e salveremo i risultati nella tabella temporanea e infine selezioneremo i record 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)
    ,HasPrimaryKeyConstraint VARCHAR(10)
    )

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,
   T.Table_Catalog as DatabaseName,
   T.Table_Schema AS TableSchema,
   T.Table_Name AS TableName,
   CCU.Column_Name AS ColumnName,
   TC.Constraint_Name AS ConstraintName,
   Case When  TC.Constraint_Name is not Null Then ''Yes''
   Else ''No'' End as HasPrimaryKeyConstraint
From
' + @DatabaseName + '.information_schema.tables T
left join 

   ' + @DatabaseName + '.information_Schema.Table_Constraints TC 
   on T.Table_Catalog=TC.Table_Catalog
   and T.Table_Schema=TC.Table_Schema
   and T.Table_Name=TC.Table_Name
   and TC.Constraint_Type=''PRIMARY KEY''
   
left JOIN
   ' + @DatabaseName + 
'.Information_Schema.constraint_column_usage CCU  
      on TC.Constraint_Name=CCU.Constraint_Name  
      and TC.Table_Name=CCU.Table_Name
      and T.Table_Type=''BASE TABLE'''

    EXEC (@SQL)

    PRINT @SQL

    FETCH NEXT
    FROM Cur
    INTO @DatabaseName
END

CLOSE Cur

DEALLOCATE Cur

--Select all records from temp table 
SELECT *
FROM #Results
 
 
 Eseguo la query precedente sulla mia istanza di SQL Server ed ecco un elenco di tabelle di tutti i database con il vincolo della chiave primaria se disponibile, altrimenti Null. Come ottenere tutte le tabelle con o senza chiave primaria Vincolo in tutto il database da SQL Server Instance-SQL Server / Esercitazione TSQL