2014-11-25 3 views
2

Я нахожусь в процессе написания довольно большого запроса, который выбирает из нескольких таблиц и объединяет их. Из-за очень плохого дизайна базы данных для каждого пользователя создается таблица.SQL Server - включить имя таблицы программно

То, что я делаю что-то вроде этого:

SELECT * 
FROM tbl1 

UNION ALL 

SELECT * 
FROM tbl2 

То, что я ищу что-то общее, чтобы добавить к каждой строке, которая позволит мне выбрать имя таблицы наряду с тем, что внутри таблицы.

Я не буду принимать ниже в качестве ответа, потому что это не то, о чем я просил.

SELECT *, 'tbl1' 
FROM tbl1 

UNION ALL 

SELECT *, 'tbl2' 
FROM tbl2 
+0

, где у вас есть пользователь против записей таблицы в БД – Mohamed

+0

Сами данные не имеет никакого значения в этом вопросе –

+0

вы должны знать имена диапазонов или таблиц, так как для объединения их.. – Mohamed

ответ

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); 
Смежные вопросы