SQL Server - 以编程方式包含表名

时间:2014-11-25 10:12:33

标签: sql sql-server

我正在编写一个非常大的查询,从多个表中选择并联合它们。由于一些非常糟糕的数据库设计,为每个用户创建了一个表。

我正在做的是这样的事情:

SELECT * 
FROM tbl1

UNION ALL

SELECT *
FROM tbl2

我正在寻找的是添加到每一行的通用内容,这使我能够选择表名以及表中的内容。

我不接受以下答案,因为这不是我要求的。

SELECT *, 'tbl1' 
FROM tbl1

UNION ALL

SELECT *, 'tbl2'
FROM tbl2

2 个答案:

答案 0 :(得分:1)

要做类似的事情,你要么必须对系统视图(sys.tables和sys.columns)进行一些相当复杂和大的查询

但是你最好在你使用的代码语言中动态构建查询并将其作为字符串执行:

一个非常粗略的例子可能是

DECLARE @tableName varchar(255) = 'tbl1';
DECLARE @tableName2 varchar(255) = 'tbl2';
DECLARE @columnList varchar(255) = 'Col1, Col2, Col3';


EXEC(
    'SELECT '+ @columnList +' FROM ' +@tableName + '

    UNION ALL

    SELECT '+ @columnList +' FROM ' +@tableName2
);

答案 1 :(得分:0)

在每次从表中选择之前,添加一个SELECT NULL,NULL,' tableName&#39 ;; (添加与表列一样多的NULL,以便联合所有不会失败'或者使用&而不是使用' - '或其他。 我想循环和获取列名称的表不应该是一个问题。
下面的演示:

create table #t1(C1 int, C2 int)
create table #t2(C1 int, C2 int)

insert #t1 (C1, C2) values (1,2)
insert #t2 (C1, C2) values (3,4)
insert #t2 (C1, C2) values (5,6)

declare @t1 varchar(10) = '#t1';
declare @t2 varchar(10) = '#t2';

declare @cols varchar(100) = 'C1, C2';
declare @sql nvarchar(4000) = ''

set @sql =
    ' SELECT NULL, NULL, ''' + @t1 + ''' ' + char(10) + char(13) +
    ' UNION ALL ' + char(10) + char(13) +
    ' SELECT '+ @cols +', NULL FROM ' + @t1 + char(10) + char(13) +
    ' UNION ALL ' + char(10) + char(13) +
    ' SELECT NULL, NULL, ''' + @t2 + ''' ' + char(10) + char(13) +
    ' UNION ALL ' + char(10) + char(13) +
    ' SELECT '+ @cols +', NULL FROM ' + @t2

-- select @sql
exec (@sql);