sql >> Base de Datos >  >> RDS >> Sqlserver

Obtenga una lista de tablas con o sin restricción de clave principal en todas las bases de datos de la instancia de SQL Server - Tutorial de SQL Server / TSQL, parte 61

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 #Results
 
 
 Ejecuto 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