2016-07-12 6 views
1

Я ниже таблицы и значения,Выбор таблицы и столбца динамически на основе других строк таблицы

Tb_name   column_name1 column_name2 
Citator_KTLO_CC Date_Created Date_Modified 
Citator_KTLO_QA Date_Created Date_Modified 

Я хочу, чтобы выбрать динамически столбец из таблицы, поэтому результат выглядит так:

Select Date_Created,Date_Modified from Citator_KTLO_CC 

и в следующем цикле он будет выбирать второй ряд, например

Select Date_Created,Date_Modified from Citator_KTLO_QA 

Как я могу это сделать, используя динамический sql?

любой пример оценивается.

+0

Вы можете разместить данные примера для таблиц и пример того, что ваш результирующий набор должен выглядеть? – GuidoG

+0

, если вы хотите, чтобы кто-то помог вам, вам нужно четко указать, что вам нужно. Как еще мы можем вам помочь? – GuidoG

ответ

2

вот пример того, как сделать это.
Поскольку вы не публикуете много информации, я просто предполагаю, что таблица, содержащая все имена таблиц, называется «таблицами»

Также это будет работать, только если все таблицы имеют одинаковые типы столбцов.

-- create a test table you dont need this 
create table tables (tb_name varchar(100) primary key, field1 varchar(100), field2 varchar(100)) 

-- fill my test table you dont need this 
insert into tables values ('table1', 'field1', 'field2') 
insert into tables values ('table2', 'foo1', 'foo2') 
insert into tables values ('table3', 'test1', 'test2') 

-- this is the actual code you need, replace the names with your real names 
declare @sql varchar(max) = '' 
declare @tb_name varchar(100) = '' 
declare @field1 varchar(100) = '' 
declare @field2 varchar(100) = '' 

declare myCursor cursor for 
    select tb_name, field1, field2 from tables -- dont know how your table is called 

open myCursor 
fetch next from myCursor into @tb_name, @field1, @field2 
while @@FETCH_STATUS = 0 
begin 
    set @sql = @sql + ' select ' + @field1 + ', ' + @field2 + ' from ' + @tb_name + ' union all ' 
    fetch next from myCursor into @tb_name, @field1, @field2 
end 
close myCursor 
deallocate myCursor 

select @sql = left(@sql, len(@sql) - 10) 

exec (@sql) 

EDIT: используя где положение возможно, но все будет получить сложнее

declare @something date = getdate() 

set @sql = @sql + ' select ' + @field1 + ', ' + @field2 + ' from ' + @tb_name + ' where ' + @field1 + ' = ' + @something + ' union all ' 

Вы можете использовать приведенный выше пример, чтобы построить то, что вам нужно просто играть с ней.

EDIT: используя ИНЕКЕ с формат даты

declare @something date = getdate() 

set @sql = @sql + ' select ' + @field1 + ', ' + @field2 + ' from ' + @tb_name + ' where ' + @field1 + ' = ''' + CONVERT(varchar(8), @something, 112) + ''' union all ' 
+0

yes offcourse Я изменил свой ответ – GuidoG

+0

Также, когда вы найдете его полезным, вы можете дать свой ответ upvote – GuidoG

+0

его работающий здесь вы можете заменить строку exec (@sql) на это: select convert (varchar (2000), @sql) а затем опубликовать результат здесь? – GuidoG

0
DECLARE @SQL VARCHAR(1000); 

SET @SQL = ' 

SELECT * 
FROM Citator_KTLO_CC 
UNION ALL 
SELECT * 
FROM Citator_KTLO_QA;' 

EXEC (@SQL); 
0

Попробуйте это .. Для выбора одной строки, если вы работаете в aloop

DECLARE @sql NVARCHAR(4000) 
SELECT @sql = ' select ' + column_name_1 + ',' + column_name2 + ' from ' + Tb_name 
FROM <yourtable> 
EXEC (@sql) 

ИЛИ

DECLARE @sql NVARCHAR(4000) 
SELECT @sql = 'union all select ' + column_name_1 + ',' + column_name2 + ' from ' + Tb_name 
FROM <yourtable> 


SET @sql =stuff(@sql,1,10,'') 
EXEC (@sql) 
0

Как о чем-то вроде этого. Если у вас более двух столбцов, вы можете использовать динамический sql для генерации списка col, чтобы затем генерировать более динамический sql вместо жесткого кодирования.

DROP TABLE #Test 

CREATE TABLE #Test 
(Tb_name NVARCHAR(15), 
column_name1 NVARCHAR(12), 
column_name2 NVARCHAR(13)); 

INSERT INTO #Test VALUES 
('Citator_KTLO_CC','Date_Created','Date_Modified'), 
('Citator_KTLO_QA','Date_Created','Date_Modified'); 

DECLARE @SQL NVARCHAR(MAX) 

SET @SQL = (SELECT STUFF((SELECT ' UNION ALL SELECT ' + Cols + ' FROM '+TbL 
FROM (SELECT QUOTENAME(Tb_name) TBL, 
     QUOTENAME(column_name1) + ', '+ 
     QUOTENAME(column_name2) Cols 
     FROM #Test) Blah 
FOR XML PATH('')),1,10,'')) 

PRINT @SQL 

EXEC sys.sp_executesql @SQL 
0
DECLARE @ColumnList1 VARCHAR(MAX) = ''''''; 
DECLARE @ColumnList2 VARCHAR(MAX) = ''''''; 

DECLARE @ColumnNameFromTable1 VARCHAR(50); 
DECLARE @ColumnNameFromTable2 VARCHAR(50); 

DECLARE MyCursor1 CURSOR 
FOR 
    SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'Citator_KTLO_CC' 
    ORDER BY ORDINAL_POSITION 

DECLARE MyCursor2 CURSOR 
FOR 
    SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'Citator_KTLO_QA' 
    ORDER BY ORDINAL_POSITION 

OPEN MyCursor1 
OPEN MyCursor2 

FETCH NEXT FROM MyCursor1 INTO @ColumnNameFromTable1; 

WHILE @@FETCH_STATUS = 0 
    BEGIN 

     FETCH NEXT FROM MyCursor2 INTO @ColumnNameFromTable2; 

     SET @ColumnList1 = @ColumnList1 + ',' + @ColumnNameFromTable1 
     SET @ColumnList2 = @ColumnList2 + ',' + @ColumnNameFromTable2 

     FETCH NEXT FROM MyCursor1 INTO @ColumnNameFromTable1; 
    END 

CLOSE MyCursor1; 
DEALLOCATE MyCursor1; 

CLOSE MyCursor2; 
DEALLOCATE MyCursor2; 

EXEC ('SELECT ' + @ColumnList1 + ' FROM Citator_KTLO_CC UNION ALL SELECT ' + 

@ColumnList2 + ' FROM Citator_KTLO_QA ') 
Смежные вопросы