如何从多个表中动态查询相同的列名

时间:2014-11-12 11:31:15

标签: sql-server tsql

我的数据库有多个共享命名约定和相同核心字段名称的表。例如,Billing_Detail_PartsBilling_Detail_Labor。我希望能够对这些表中的price字段进行求和查询。我们会定期添加新表,所以我想做SELECT SUM(PRICE) FROM Billing_Detail_*之类的事情,而不是对表名进行硬编码。有没有办法在不将其作为函数的情况下实现此目的?

2 个答案:

答案 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;