Я нашел решение этой проблемы. Мы можем построить функцию или представление с «визуализированным» sql в хранимой процедуре, которая затем может быть выполнена как обычно.
1.Создайте еще одного звездочку
CREATE PROCEDURE [dbo].[usp_FunctionBuilder]
DECLARE @outerSql VARCHAR(MAX)
DECLARE @innerSql VARCHAR(MAX)
2.Создайте динамический sql, который вы хотите выполнить в своей функции (Пример: вы можете использовать цикл и объединение, вы можете прочитать в другом sproc, использовать операторы if и параметры для условного sql и т. Д.)
SET @innerSql = 'your sql'
3. Оберните @innerSql в оператор создания функции и определите все внешние параметры, которые вы использовали в @innerSql, чтобы их можно было передать в сгенерированную функцию.
SET @outerSql = 'CREATE FUNCTION [dbo].[fn_GeneratedFunction] ( @Param varchar(10))
RETURNS TABLE
AS
RETURN
' + @innerSql;
EXEC(@outerSql)
Это просто псевдокод, но решение решает многие проблемы, такие как ограничения связанного сервера, параметры, динамический sql в функции, динамическое имя сервера / базы данных / таблицы, циклы и т. Д.
Вам нужно будет настроить его под свои нужды, (пример: изменение возврата в функции)