В документах ясно сказано, что:
Пользовательские функции не могут использовать динамический SQL или временные таблицы. Допустимы переменные таблицы.
, что означает, что вам нужно использовать хранимую процедуру, и это неплохо, поскольку вы все равно можете вставить данные в таблицу, если хотите:
INSERT INTO @Table
EXEC [dbo].[stored_procedured_name]
INSERT INTO #Table
EXEC [dbo].[stored_procedured_name]
Итак, в вашем случае у вас будет:
CREATE PROCEDURE udf_alldata
AS
BEGIN
DECLARE @Var VARCHAR(MAX) = ''
SELECT
@Var = STUFF((SELECT ' SELECT * FROM [' + tbl.TableNames + '] UNION ALL'
FROM [TestDB].SYS.TABLES tb
INNER JOIN [TestDB].dbo.[tbl_tablesinfo] tbl ON tb.name = tbl.TableNames
FOR XML PATH('')), 1, 1, '');
SET @var = LEFT(@var, LEN(@var) - 10);
EXEC sp_executesql @var
RETURN
END
Обратите внимание, что на самом деле вы можете выполнить dynamic T-SQL in function
, но это особый случай с использованием SQL CLR. Я могу показать вам, как это сделать, но лучше придерживаться хранимой процедуры.