Чтобы сделать это динамически, вам нужно создать SQL-оператор, который выглядит следующим образом
select tb_value.*, tb_usertype.title as Descr
from tb_value
inner join tb_usertype
on tb_value.extid = tb_usertype.id
where tb_value.tb_module_id = 1
union all
select tb_value.*, tb_religion.religionname as Descr
from tb_value
inner join tb_religion
on tb_value.extid = tb_religion.id
where tb_value.tb_module_id = 2
-- union 40 other tables
В настоящее время вы не можете этого сделать, потому что в базе данных нет никакой информации, указывающей, какой столбец использовать из tb_religion, tb_usertype и т. Д. Вы можете добавить это как новое поле в tb_module.
Если у вас есть имя поля для использования в tb_module, вы можете создать представление, которое делает то, что вы хотите.
И вы можете добавить триггер к таблице tb_modules, который изменяет представление всякий раз, когда изменяется tb_modules. Таким образом, вам не нужно использовать динамический sql от клиента при выполнении запросов. Единственное, о чем вам нужно беспокоиться, это то, что таблицу необходимо создать в БД, прежде чем вы добавите новую строку в tb_modules
Редактировать 1
Конечно, код в триггере должен динамически создавать оператор alter view.
Редактировать 2 Вам также необходимо иметь поле с информацией о том, какие столбцы в tb_usertype, tb_religion и т. Д. Присоединяются к tb_value.extid (usertype_OR_religion_ID). Или вы можете предположить, что поле всегда будет называться id
Редактировать 3 Вот как вы можете построить триггер для tb_module, который изменяет представление v_values. Я добавил fieldname в качестве столбца в tb_modules, и я предполагаю, что поле id в связанных таблицах называется id.
create trigger tb_modules_change on tb_modules after insert, delete, update
as
declare @sql nvarchar(max)
declare @moduleid int
declare @tablename varchar(50)
declare @fieldname varchar(50)
set @sql = 'alter view v_value as '
declare mcur cursor for
select id, tablename, fieldname
from tb_modules
open mcur
fetch next from mcur into @moduleid, @tablename, @fieldname
while @@FETCH_STATUS = 0
begin
set @sql = @sql + 'select tb_value.*, '+@tablename+'.'+@fieldname+' '+
'from tb_value '+
'inner join '+@tablename+' '+
'on tb_value.extid = '+@tablename+'.id '+
'where tb_value.tb_module_id = '+cast(@moduleid as varchar(10))
fetch next from mcur into @moduleid, @tablename, @fieldname
if @@FETCH_STATUS = 0
begin
set @sql = @sql + ' union all '
end
end
close mcur
deallocate mcur
exec sp_executesql @sql