I am working on a multitenant application. Most of the tables contain a column tenant_id. I want the number of rows in all tables for a particular tenant_id.
Example, Tables:-
create table Employee(id integer, name varchar(100), tenantid integer); insert into Employee(id, name, tenantid) values(1, "Stephan", 64); insert into Employee(id, name, tenantid) values(2, "Alan", 64); insert into Employee(id, name, tenantid) values(3, "Charles", 46); create table Student(id integer, name varchar(100), standard integer, tenantid integer); insert into Student(id, name, standard, tenantid) values(1, "James", 2, 64); insert into Student(id, name, standard, tenantid) values(2, "Rony", 4, 64); insert into Student(id, name, standard, tenantid) values(3, "Steve",6, 64); create table Teacher(id integer, name varchar(100), subject varchar(100), tenantid integer); insert into Teacher(id, name, subject, tenantid) values(1, "Alvin", "Science", 46); insert into Teacher(id, name, subject, tenantid) values(2, "Neil", "Geography", 64); insert into Teacher(id, name, subject, tenantid) values(3, "Amy", "Mathematics", 46);`
Sample result to get number of rows in every table having tenantid = 64
| TableName | Count |
|---|---|
| Employee | 2 |
| Student | 3 |
| Teacher | 1 |
How do I loop through all the tables and query where tenantid = <tenantid>
Advertisement
Answer
Use Dynamic Query. Form the query dynamically for each table and use string_agg() to concatenate it and execute the query using sp_executesql
declare @tables varchar(max),
@tenantid int,
@sql nvarchar(max)
select @tables = 'Employee,Student,Teacher',
@tenantid = 64;
select @sql = string_agg('select [TableName] = ''' + value + ''', [Count] = count(*) from ' + quotename(value) + ' where tenantid = @tenantid', ' union all' + char(13) )
from string_split(@tables, ',')
print @sql
exec sp_executesql @sql, N'@tenantid int', @tenantid