2016-12-06 2 views
0

Ищете простой способ для вставки выбрать значения столбцов:INSERT - SELECT * вместо одного столбца

Пример

TableA TABLEB 
----------------- 
Field1 Field1 
Field2 Field2 
Field3 Field3 
Field4 Field4 
Field5 Field5 
      FleldX 

Мои таблицы содержат около 80 столбцов. Теперь я хочу просто скопировать данные из одной таблицы в другую, как:

Insert Into table B (Field1, Field2, Field3, Field4, Field5, FieldX) 
VALUES SELECT (Field1, Field2, Field3, Field4, Field5, 'HARDCODEVALUE') 
     FROM TableA 

Мне нужно установить явное все 80 имен столбцов, или лучшее решение было бы, если карта поля автоматически, так что я могу установить, как это делать

Insert Into table B (Field1, Field2, Field3, Field4, Field5, FieldX) 
VALUES 
    SELECT (Field4, Field3, Field2, Field1, Field5, 'HARDCODEVALUE' AS FieldX) 
    FROM TableA 

Где я могу изменить порядок имен столбцов, а SQL - сделать для меня другое?

Какой способ лучше всего использовать?

+9

Лучший способ - явно указать все имена столбцов как в 'select', так и' insert'. Зачем рисковать получить вещи в неправильном порядке? –

+0

Существует множество инструментов SQL Server, которые могут помочь устранить боль. Перетаскивание таблицы в окно SQL Studio Management позволит вам быстро построить инструкцию SELECT со всеми именами полей, например. Или на стороне сервера, если вы хотите скопировать данные из одной таблицы в другую, интерфейс перетаскивания SSIS и автоматическое сопоставление имен столбцов могут облегчить жизнь. –

+1

Несвязанные, но: круглые скобки вокруг списка столбцов в инструкции 'select' абсолютно бесполезны –

ответ

1

Хорошо, сначала ваш синтаксис не будет работать ни на что. Попробуйте

INSERT INTO tableB (Field1, Field2, Field3, Field4, Field5, FieldX) 
SELECT Field4, Field3, Field2, Field1, Field5, 'HARDCODEVALUE' AS FieldX 
FROM TableA 

Следующая да вы всегда должны использовать все столбцы в порядке, вы хотите, чтобы вставить их в таблицу и в избранных и вставить. В противном случае это очень большой антипаттерн SQL, и это вызовет проблемы в строке, особенно если столбцы меняются. Вы всегда хотите, чтобы правый столбец соответствовал правильному столбцу. Это становится еще более проблематичным, если имена полей не всегда являются прямыми совпадениями.

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

Я мог бы предложить вам использовать таблицы informationschema, чтобы найти столбцы «на лету», но действительно, если tableA добавляет столбец, откуда вы знаете, какой столбец отображает его в tableB? Если столбец удален из таблицы B, как вы знаете, чтобы удалить этот столбец для удаления из таблицы A в SELECT? Позвольте мне проиллюстрировать эту проблему.

Предположим, у вас есть эта структура:

TABLEA 
USERID 
USERLOGIN 
USERPASSWORD 

TABLEB 
USERID 
SYSLOGIN 
SYSPASSWORD 
USERTYPE 

Затем, глядя на SELECT * вставить

INSERT INTO tableB 
SELECT *, 'User' AS USERTYPE 
FROM TableA 

который является эквивалентом

INSERT INTO tableB (USERID,SYSLOGIN,SYSPASSWORD,USERTYPE) 
SELECT USERID,USERLOGIN,USERPASSWORD, 'User' AS USERTYPE 
FROM TableA 

На данный момент все в порядке. Но что происходит, когда структура меняется?

Тогда структура становится

TABLEA 
USERID 
USERLOGIN 
USERPASSWORD 
LASTLOGINDATE 

TABLEB 
USERID 
SYSLOGIN 
SYSPASSWORD 
USERTYPE 
LASTLOGINDATE 

При использовании выберите *

INSERT INTO tableB 
SELECT * 
FROM TableA 

является эквивалентом

INSERT INTO tableB (USERID,SYSLOGIN,SYSPASSWORD,USERTYPE, LASTLOGINDATE) 
SELECT USERID,USERLOGIN,USERPASSWORD, LASTLOGINDATE,'User' AS USERTYPE 
FROM TableA 

Как вы можете видеть, используя SELECT *, Вы заканчиваете с помощью LASTLOGINDATE, пытающегося быть вставленным в USERTYPE, и значения, которое вы ранее жестко кодировали USERTYPE, вступая в LAST LOGINDATE. Это связано с тем, что, когда вы не укажете столбцы, SQL-сервер примет их в порядке.Если последние два столбца представляют собой разные несовместимые типы данных, запрос будет терпеть неудачу. Хуже, если они совместимы с типами данных, потому что запрос будет успешным, и у вас будут плохие данные в вашей базе данных.

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

Смежные вопросы