[SQL] Select tabellen met geen records
Lendl Verschoor
25/09/2013 11:47:02Is het mogelijk om met een query alle tabel namen in een database te weergeven die geen records hebben?
Het gaat om een Microsoft DB Server (MSSQL)
Te snel gesproken, oplossing gevonden
Het gaat om een Microsoft DB Server (MSSQL)
Te snel gesproken, oplossing gevonden
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT
t.NAME AS TableName,
i.name as indexName,
p.[Rows],
sum(a.total_pages) as TotalPages,
sum(a.used_pages) as UsedPages,
sum(a.data_pages) as DataPages,
(sum(a.total_pages) * 8) / 1024 as TotalSpaceMB,
(sum(a.used_pages) * 8) / 1024 as UsedSpaceMB,
(sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
sys.allocation_units a ON p.partition_id = a.container_id
WHERE
t.NAME NOT LIKE 'dt%' AND
i.OBJECT_ID > 255 AND
i.index_id <= 1
GROUP BY
t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY
object_name(i.object_id)
t.NAME AS TableName,
i.name as indexName,
p.[Rows],
sum(a.total_pages) as TotalPages,
sum(a.used_pages) as UsedPages,
sum(a.data_pages) as DataPages,
(sum(a.total_pages) * 8) / 1024 as TotalSpaceMB,
(sum(a.used_pages) * 8) / 1024 as UsedSpaceMB,
(sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
sys.allocation_units a ON p.partition_id = a.container_id
WHERE
t.NAME NOT LIKE 'dt%' AND
i.OBJECT_ID > 255 AND
i.index_id <= 1
GROUP BY
t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY
object_name(i.object_id)
Gewijzigd op 25/09/2013 11:50:02 door Lendl Verschoor
PHP hulp
22/12/2024 18:30:37Erwin H
25/09/2013 12:23:54Bedoel je in een query waarin je dynamisch de tabelnamen ophaalt en dan checkt of er records in zitten? Dan niet denk ik. Als je vooraf de namen gedefinieerd hebt (in elk geval voor de query), dan is het wel mogelijk. In dat geval zou je een count query voor elke tabel kunnen laten lopen en via een union die allemaal bij elkaar kunnen zetten. Zoiets bijvoorbeeld:
Wil je het echter dynamisch doen dan moet je selecteren uit een tabel naam die zelf in feite een parameter is. Bij mijn weten is dat niet mogelijk in SQL (maar wie beter weet: verbeter me).
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT tabel_naam, aantal_records
FROM (
SELECT 'tabel1' AS tabel_naam, COUNT(*) as aantal_records
FROM tabel1
UNION
SELECT 'tabel2', COUNT(*)
FROM tabel2
)
WHERE aantal_records = 0;
FROM (
SELECT 'tabel1' AS tabel_naam, COUNT(*) as aantal_records
FROM tabel1
UNION
SELECT 'tabel2', COUNT(*)
FROM tabel2
)
WHERE aantal_records = 0;
Wil je het echter dynamisch doen dan moet je selecteren uit een tabel naam die zelf in feite een parameter is. Bij mijn weten is dat niet mogelijk in SQL (maar wie beter weet: verbeter me).