Escenario:
Está trabajando como desarrollador de SQL Server / DBA de SQL Server para una compañía de seguros. Está creando documentación para objetos de base de datos. Debe obtener una lista de todas las tablas de toda la base de datos de la instancia de SQL Server sin restricciones de clave principal.Solución:
Podemos usar las vistas del sistema para enumerar las tablas con restricción de clave principal o no de cada base de datos. Como la consulta tiene que ejecutarse en cada una de las bases de datos para recopilar esta información, necesitamos recorrer la lista de bases de datos de usuarios, usaremos el cursor para realizar un recorrido por todas las bases de datos en la instancia de SQL Server. Construiremos nuestro sql dinámico para cada base de datos y guardaremos los resultados en la tabla temporal y finalmente seleccionaremos los registros para mostrar.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 #ResultsEjecuto la consulta anterior en mi instancia de SQL Server y aquí hay una lista de tablas de todas las bases de datos con restricción de clave principal si está disponible, de lo contrario es nula. Cómo obtener todas las tablas con o sin clave principal Restricción en toda la base de datos desde SQL Server Instance- SQL Server / Tutorial de TSQL