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

Come ottenere l'elenco delle tabelle senza vincoli di chiave primaria in tutti i database di istanze di SQL Server - Tutorial SQL Server/TSQL Parte 62

Scenario:

Lavori come sviluppatore di SQL Server o DBA di SQL Server. È necessario ottenere l'elenco di tutte le tabelle da tutti i database nell'istanza di SQL Server che non dispongono di vincoli di chiave primaria. Come lo faresti?


Soluzione:

Utilizzeremo le viste di sistema per ottenere tutte le tabelle da tutti i database nell'istanza di SQL Server che non hanno vincoli di chiave primaria.
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)
    )
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,
   Table_CataLog as DatabaseName,
   Table_Schema as TableSchema,
   Table_Name as TableName      
from
   '+@DatabaseName+'.information_schema.tables T     
where
   Not Exists(
      Select
         1 
      from
         '+@DatabaseName+'.information_Schema.Table_Constraints C     
      where
         Constraint_Type=''PRIMARY KEY''     
         and C.Table_Name=T.Table_Name     
         and C.Table_Schema=T.Table_Schema
   )     
   and 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
 
 Ho eseguito la query precedente sulla mia istanza di SQL Server e ho ottenuto un elenco di tabelle da tutti i database che non hanno vincoli di chiave primaria.

Ottieni tutte le tabelle dall'istanza di SQL Server che non hanno il vincolo della chiave primaria - SQL Server / Esercitazione TSQL