2014-11-25 57 views
2

我正在編寫一個相當大的查詢過程,從多個表中進行選擇並將它們聯合起來。由於一些非常差的數據庫設計,爲每個用戶創建一個表。SQL Server - 以編程方式包含表名

什麼我做的是這樣的:

SELECT * 
FROM tbl1 

UNION ALL 

SELECT * 
FROM tbl2 

我所尋找的東西一般添加到每一行,使我與表裏面有什麼沿着選擇的表名。

我不會接受下面的答案,因爲那不是我所要求的。

SELECT *, 'tbl1' 
FROM tbl1 

UNION ALL 

SELECT *, 'tbl2' 
FROM tbl2 
+0

,你在哪裏有對錶中的記錄用戶在DB – Mohamed 2014-11-25 10:26:31

+0

數據本身就是在這個問題上不相關的 – 2014-11-25 10:29:53

+0

你必須知道的範圍內或表名,以工會它們。 – Mohamed 2014-11-25 10:30:55

回答

1

做這樣的事情,你要麼必須做出一些相當複雜和大查詢到系統視圖(SYS.TABLES和SYS.COLUMNS)

但你是正確的更好構建查詢動態地什麼都代碼lanuage您使用並執行它作爲一個字符串:

一個非常粗略的例子是像

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


EXEC(
    'SELECT '+ @columnList +' FROM ' [email protected] + ' 

    UNION ALL 

    SELECT '+ @columnList +' FROM ' [email protected] 
); 
0

每個之前選擇從表中添加一個SELECT NULL,NULL,'tableName'; (添加儘可能多的NULL作爲表列,以便所有的聯合不'失敗'或者,而不是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); 
相關問題