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