Как вызвать динамический запрос в функции Mssql?

Стоит задача создать функцию, которая будет возвращать топ студентов. Проблема в том, что в функции нельзя использовать Exec, а без динамического запроса нет возможности сделать из-за @tab_name.
spoiler
GO
CREATE FUNCTION TopStud(@numk int)
RETURNS varchar(max)
BEGIN
	DECLARE @c int, @stud varchar(max), @tb_name varchar(max), @tb_sql varchar(max);
	SET @c = (SELECT COUNT(name) FROM tempdb.sys.tables WHERE name LIKE '##tb_'+ '[0-9]'+ '[0-9]'+ '[0-9]'+'_'+ CAST((@numk * 2 - 1) as varchar)
		OR name LIKE '##tb_'+ '[0-9]'+ '[0-9]'+ '[0-9]'+'_'+ CAST((@numk * 2) as varchar));
	WHILE @c > 0
		BEGIN
			SET @tb_name = (SELECT name FROM (SELECT name,ROW_NUMBER() over (order by name) as rnum FROM tempdb.sys.tables WHERE name LIKE '##tb_'+ '[0-9]'+ '[0-9]'+ '[0-9]'+'_'+ CAST((@numk * 2 - 1) as varchar)
			OR name LIKE '##tb_'+ '[0-9]'+ '[0-9]'+ '[0-9]'+'_'+ CAST((@numk * 2) as varchar)) as t1 WHERE rnum = @c);

			SET @tb_sql = 'SELECT DISTINCT TOP(5) CONCAT(Id, FIO, CAST(SUM(Mark)/COUNT(Mark) as varchar)) FROM Students 
			JOIN Discipline ON DGroupNum = GroupNum 
			JOIN '+ @tb_name+' ON Id = IdStud WHERE DSemestr = '+CAST((@numk * 2 - 1) as varchar)+' OR DSemestr = '+CAST((@numk * 2) as varchar)+' GROUP BY Id, FIO;'
			EXEC(@tb_sql);
			SET @c = @c - 1; 
		END;	
	RETURN @stud;
END;

  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 2
tsklab
@tsklab
Системный администратор, программист
Проблема в том, что в функции нельзя использовать Exec
Лень проверять, а это сработает?EXECUTE sp_executesql @tb_sql
Ответ написан
@ViaCom
Никак. Но вопрос зачем нужна именно функция. Чем продиктована такая необходимость? Почему не процедура?
Если совсем приперло, тогда CLR
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Делис Инфо Москва
от 70 000 до 80 000 руб.
Arkadium Ростов-на-Дону
от 120 000 руб.
Arkadium Краснодар
от 120 000 руб.
22 авг. 2018, в 08:57
113 руб./за 1000 зн.
22 авг. 2018, в 08:50
10000 руб./за проект
22 авг. 2018, в 06:57
150 руб./в час