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