Использовать имена столбцов в качестве параметра при вставке в существующую таблицу - PullRequest
1 голос
/ 19 марта 2020

Я хочу скопировать данные из одной таблицы в другую существующую таблицу. Для этого я использую следующий запрос:

insert into table_A(col1, col2, .....)
select col1, col2, .....
from table_B

Но я хочу, чтобы этот список столбцов происходил из существующей таблицы или представления. Таблица содержит столбец col_name, который содержит все имена столбцов.

Я хочу что-то, что указано ниже:

insert into table_A(select col_name from y)
select (select col_name from y)
from table_B

1 Ответ

0 голосов
/ 19 марта 2020

То, что вы запрашиваете, требует динамичности c SQL: то есть создайте строку запроса, а затем выполните ее. Предполагая, что ваша версия SQL Сервер поддерживает string_agg():

declare @lst nvarchar(max), @sql nvarchar(max);
select @lst = string_agg(col_name, ', ') within group(order by col_name) from y;
set @sql = N'insert into table_a (' + @lst + N') select ' + @lst + N' from table_b';
EXEC sp_executesql @sql;

Демонстрация на БД Fiddle :

create table table_a(id int, val int);
create table table_b(id int, val int);
create table y(col_name varchar(10));

insert into y values('id'), ('val');
insert into table_b values(1, 2), (3, 4);

declare @lst nvarchar(max), @sql nvarchar(max);
select @lst = string_agg(col_name, ', ') within group(order by col_name) from y;
set @sql = N'insert into table_a (' + @lst + N') select ' + @lst + N' from table_b';
EXEC sp_executesql @sql;

select * from table_b;
id | val
-: | --:
 1 |   2
 3 |   4
...