This query listed tables without primary keys and this one shows how many of them there are and what is the percentage of total tables.
Query
select
all_tabs.[tables] as all_tables,
no_pk.[tables] as no_pk_tables,
cast(cast(100.0 * no_pk.[tables] /
all_tabs.[tables] as decimal(36, 1)) as varchar) + '%' as no_pk_percent
from
(select count(*) as [tables]
from sys.tables as tab
left outer join sys.indexes as pk
on tab.object_id = pk.object_id
and pk.is_primary_key = 1
where pk.object_id is null) as no_pk
inner join
(select count(*) as [tables]
from sys.tables) as all_tabs
on 1 = 1
Columns
- all_tables - number of all tables in a database
- no_pk_tables - number of tables without a primary key
- no_pk_percent - percentage of tables without primary key in all tables
Rows
The query returns just one row.
Sample results
Sample results that show how many tables don't have primary keys in the AdventureWorksLT database and the percentage it represents.