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 #ResultsEseguo 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