Автоматически сопоставлять столбцы в INSERT INTO... SELECT... FROM

Вопрос SQL Server. При выполнении

INSERT INTO T1 SELECT (C1, C2) FROM T2

Я не хочу указывать имена столбцов T1, потому что они такие же, как в T2

Можно ли это сделать?

В настоящее время я получаю сообщение об ошибке

Msg 213, уровень 16, состояние 1, строка 1

Имя столбца или количество заданных значений не соответствует определению таблицы.

Ответ 1

Если T1 и T2 совпадают, у вас есть два варианта. Вы можете использовать select все столбцы из T2 для insert into T1, или вы можете предоставить список столбцов в инструкции insert.

Несмотря на то, что при выполнении select MSSQL предоставляет заголовки столбцов, эта информация не используется оператором insert для соответствия столбцам вверх.

Ответ 2

Да, вы можете опустить имена полей для таблицы, в которую вы вставляете, и вы можете использовать select * для получения всех полей из таблицы, но я бы не рекомендовал этот подход.

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

Ответ 3

Всегда используйте явные столбцы как в INSERT, так и в проекции SELECT. Даже если вы этого не хотите, вы должны:

INSERT INTO T1 (C1, c2)
SELECT C1, C2 FROM T2

Ответ 4

Почему бы просто не

INSERT INTO t1
SELECT * FROM T2

Ответ 5

Если вас беспокоят имена столбцов, вы всегда можете их использовать:

INSERT INTO T1 (C1, c2)
SELECT C1 AS C1_ALIAS, C2 AS C2_ALIAS FROM T2

Или, более лаконично:

INSERT INTO T1 (C1, c2)
SELECT C1 C1_ALIAS, C2 C2_ALIAS FROM T2

Хотя я не могу по-настоящему думать, почему нужно было бы на таком простом примере

Ответ 6

Сначала выберите этот sql, выберите строку таблицы из результата sql и измените целевое или исходное имя табуляции. Если таблицы имеют одинаковые столбцы (такой же порядок не требуется), это будет работа.

 with xparams as (      select (select user from dual) "OWNER", '' "ADDSTRTOFROMTABLENAME" from dual  )
  ,t1 as (  SELECT dbat.table_name from dba_tables dbat, xparams where dbat.owner = xparams.OWNER )
  ,t1c1 as (  SELECT utcs.table_name ,  LISTAGG(utcs.column_name,',') within group (order by utcs.column_name) "COLS"  from USER_TAB_COLUMNS utcs, t1 where utcs.table_name = t1.table_name group by utcs.table_name )
  ,res1 as ( SELECT 'insert into '|| t1c1.table_name || ' ( '|| t1c1.COLS ||') select '|| t1c1.COLS || ' from ' || t1c1.table_name||xparams.ADDSTRTOFROMTABLENAME ||';' "RES" from t1c1, xparams order by t1c1.table_name )
select * from res1

Ответ 7

Он ссылается следующим образом:

INSERT INTO NEWTABLENAME COL1[,COL2,..COLN]
SELECT COL1[,COL2,..COLN] FROM THE EXISTINGTABLENAME