如何复用SQL列列表?避免代码重复的技术咨询
实现SQL列列表复用的几种实用方法
方法1:动态SQL拼接执行
这是最贴近你预期写法的方案,把重复的列列表存到变量里,再拼接成完整SQL执行:
DECLARE @ColumnList NVARCHAR(MAX) = 'a,b,c as foo,d,e,f,g,h,i,j as bar'; DECLARE @FullSql NVARCHAR(MAX); SET @FullSql = 'SELECT ' + @ColumnList + ' FROM [fn_MyFunction](1) UNION SELECT ' + @ColumnList + ' FROM [fn_MyFunction](2) UNION SELECT ' + @ColumnList + ' FROM [fn_MyFunction](3) UNION SELECT ' + @ColumnList + ' FROM [fn_MyFunction](4)'; EXEC sp_executesql @FullSql;
注意:如果列名或别名包含特殊字符,要做好转义;动态SQL要注意SQL注入风险,这里列列表是你自己定义的,风险可控。
方法2:参数列表+交叉应用(无动态SQL)
不用拼接SQL,先把所有要传入的参数整理成一个集合,再通过交叉应用调用函数,列列表只写一次:
WITH FunctionParams AS ( SELECT 1 AS Param UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 ) SELECT a,b,c as foo,d,e,f,g,h,i,j as bar FROM FunctionParams CROSS APPLY [fn_MyFunction](Param);
这种写法更简洁,后续要加参数直接在CTE里新增行就行,维护起来更方便。
方法3:视图封装列结构(长期复用场景)
如果这个列列表会在多处用到,可以创建视图来封装列的选择和别名:
CREATE VIEW vw_MyFunction_Columns AS SELECT a,b,c as foo,d,e,f,g,h,i,j as bar FROM [fn_MyFunction](0); -- 用一个能返回正确结构的参数占位,确保视图可编译
之后调用时直接用视图列结构:
SELECT * FROM [fn_MyFunction](1) UNION SELECT * FROM [fn_MyFunction](2) UNION SELECT * FROM [fn_MyFunction](3) UNION SELECT * FROM [fn_MyFunction](4);
前提是函数返回的结构和视图定义完全一致,适合列结构长期固定的场景。
内容的提问来源于stack exchange,提问作者Strill
相关产品推荐
相关产品推荐

