Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenir la liste des tables avec ou sans contrainte de clé primaire dans toutes les bases de données à partir de l'instance SQL Server - Tutoriel SQL Server / TSQL Partie 61

Scénario :

Vous travaillez en tant que développeur SQL Server / SQL Server DBA pour une compagnie d'assurance. Vous créez une documentation pour les objets de base de données. Vous devez obtenir la liste de toutes les tables de toutes les bases de données à partir de l'instance SQL Server sans contraintes de clé primaire.


Solution :

Nous pouvons utiliser les vues système pour lister les tables avec contrainte de clé primaire ou non de chaque base de données. Comme la requête doit s'exécuter sur chacune des bases de données pour recueillir ces informations, nous devons parcourir la liste des bases de données utilisateur, nous utiliserons le curseur pour effectuer une boucle dans toutes les bases de données sur l'instance SQL Server. Nous allons construire notre sql dynamique pour chaque base de données et enregistrer les résultats dans la table temporaire et enfin nous sélectionnerons les enregistrements à afficher.
USE masterGO--Declare VariablesDECLARE @DatabaseName AS VARCHAR(500)--Create Temp Table pour enregistrer les résultatsIF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #ResultsCREATE 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 CURSORFORSELECT '[' + NAME + ']' AS DBNameFROM sys.databasesWHERE NAME NOT IN ( 'master' ,'tempdb' ,'model' , 'msdb' )OPEN CurFETCH NEXTFROM CurINTO @DatabaseNameWHILE @@FETCH_STATUS =0BEGIN --Construire SQL dynamique pour chaque base de données DECLARE @SQL VARCHAR(MAX) =NULL SET @SQL ='Insert into #Results Select @@ServerName, T.Table_Catalog as DatabaseName, T.Table_Schema AS TableSc hema, T.Table_Name AS TableName, CCU.Column_Name AS ColumnName, TC.Constraint_Name AS ConstraintName, Case Lorsque TC.Constraint_Name n'est pas Null Alors ''Oui'' Sinon ''Non'' Fin comme HasPrimaryKeyConstraintFrom' + @DatabaseName + '. information_schema.tables Tleft join ' + @DatabaseName + '.information_Schema.Table_Constraints TC sur T.Table_Catalog=TC.Table_Catalog et T.Table_Schema=TC.Table_Schema et T.Table_Name=TC.Table_Name et TC.Constraint_Type=''PRIMARY KEY' ' JOIN gauche ' + @DatabaseName + 
'.Information_Schema.constraint_column_usage CCU sur TC.Constraint_Name=CCU.Constraint_Name et TC.Table_Name=CCU.Table_Name et T.Table_Type=''BASE TABLE''' EXEC (@SQL) PRINT @SQL FETCH NEXT FROM Cur INTO @DatabaseNameENDCLOSE CurDEALLOCATE Cur--Sélectionner tous les enregistrements de la table temporaire SELECT *FROM #Results
 
 
 J'exécute la requête ci-dessus sur mon instance SQL Server et voici la liste des tables de toutes les bases de données avec la contrainte de clé primaire si disponible sinon Null. Comment obtenir toutes les tables avec ou sans contrainte de clé primaire dans toute la base de données à partir de SQL Server Instance - SQL Server / Tutoriel TSQL