【发布时间】:2019-11-05 05:27:55
【问题描述】:
创建一个用户定义的表值函数,该函数应返回 select union all 动态查询。
我有表 tbl_tablesinfo,其中包含表名 tbl1、tbl2、tbl3 等,共有大约 3000 个表名。
我不想创建视图,而是创建函数,它应该通过 union all 返回所有表 select * from。
我的尝试:
CREATE FUNCTION udf_alldata()
RETURNS TABLE
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 @var
RETURN
END
我收到一个错误:
“BEGIN”附近的语法不正确。
这样做的原因是使用 3k 表创建视图变得越来越慢并且需要大约 30 分钟的时间,所以我正在通过创建函数来寻找替代方案。
【问题讨论】:
-
通过说
returns table而不定义表,您正在创建一个内联表值函数,其中只能有一个return select。如果您想要一个常规的表值函数,则需要定义返回表。请咨询docs。
标签: sql sql-server tsql sql-server-2012