我的数据库有多个共享命名约定和相同核心字段名称的表。例如,Billing_Detail_Parts
和Billing_Detail_Labor
。我希望能够对这些表中的price字段进行求和查询。我们会定期添加新表,所以我想做SELECT SUM(PRICE) FROM Billing_Detail_*
之类的事情,而不是对表名进行硬编码。有没有办法在不将其作为函数的情况下实现此目的?
答案 0 :(得分:0)
你可以尝试下一段代码,也许这个代码的表现不是最好的,但它必须帮助你获得欲望的结果:
declare @tbl_name nvarchar(max),
@exec_str nvarchar(max),
@parm_definition nvarchar(max),
@like nvarchar(max),
@select_col nvarchar(max)
declare @sum float,
@sum_out float
declare @cnt int,
@i int
set @parm_definition = N'@sumOUT float OUTPUT'
set @select_col = 'PRICE'
set @like = 'Billing_Detail_%'
set @tbl_name = ''
set @exec_str = ''
set @cnt = (select count(table_name) from INFORMATION_SCHEMA.TABLES where TABLE_NAME like @like)
set @sum = 0
set @i = 1
while @i <= @cnt
begin
set @tbl_name = (select TABLE_NAME
from (select ROW_NUMBER() over (order by TABLE_NAME) cnt, TABLE_NAME
from INFORMATION_SCHEMA.TABLES
where TABLE_NAME like @like) t
where t.cnt = @i)
set @exec_str = N'select @sumOUT = sum(' + @select_col + ') from ' + @tbl_name
execute sp_executesql @exec_str,
@parm_definition,
@sumOUT = @sum_out OUTPUT
set @sum = @sum + isnull(@sum_out, 0)
set @i = @i + 1
end
select @sum price
答案 1 :(得分:0)
我认为解决这个问题的最佳方法是观点。每次添加一个应包含在此总和中的新表时,您只需更改视图以包含它即可。我们有一个构建过程可以自动改变我们的视图,我们做了一些非常类似的事情。
一旦进行了视图设置,您就可以将视图用作普通表并进行汇总/排序/甚至更新/删除(如果您选择)。如果视图效果不佳,则可以查看索引视图。
CREATE VIEW vwNewTable
AS
SELECT billing_detail_parts, billing_detail_labor
FROM tableA
UNION ALL
SELECT billing_detail_parts, billing_detail_labor;
ALTER VIEW vwNewTable
AS
SELECT billing_detail_parts, billing_detail_labor
FROM tableA
UNION ALL
SELECT billing_detail_parts, billing_detail_labor
UNION ALL
SELECT billing_detail_parts, billing_detail_labor;