Scenario:
Lavori come sviluppatore di SQL Server o DBA di SQL Server. È necessario ottenere l'elenco di tutte le tabelle da tutti i database nell'istanza di SQL Server che non dispongono di vincoli di chiave primaria. Come lo faresti?Soluzione:
Utilizzeremo le viste di sistema per ottenere tutte le tabelle da tutti i database nell'istanza di SQL Server che non hanno vincoli di chiave primaria.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)
)
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,
Table_CataLog as DatabaseName,
Table_Schema as TableSchema,
Table_Name as TableName
from
'+@DatabaseName+'.information_schema.tables T
where
Not Exists(
Select
1
from
'+@DatabaseName+'.information_Schema.Table_Constraints C
where
Constraint_Type=''PRIMARY KEY''
and C.Table_Name=T.Table_Name
and C.Table_Schema=T.Table_Schema
)
and 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 Ho eseguito la query precedente sulla mia istanza di SQL Server e ho ottenuto un elenco di tabelle da tutti i database che non hanno vincoli di chiave primaria.

Ottieni tutte le tabelle dall'istanza di SQL Server che non hanno il vincolo della chiave primaria - SQL Server / Esercitazione TSQL