Хорошо, сначала ваш синтаксис не будет работать ни на что. Попробуйте
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-сервер примет их в порядке.Если последние два столбца представляют собой разные несовместимые типы данных, запрос будет терпеть неудачу. Хуже, если они совместимы с типами данных, потому что запрос будет успешным, и у вас будут плохие данные в вашей базе данных.
Другие проблемы, которые могут возникнуть, состоят в том, что если вы не укажете имена столбцов, вам нужно иметь то же самое количество столбцов для работы вставки. Если вы добавите столбец в одну таблицу, а не другую, у вас возникнут проблемы. Если вы удалите столбец из середины таблицы и добавьте столбец, вы можете в конечном итоге изменить тот столбец, на который сопоставлены несколько столбцов, которые будут вызывать ошибку, если типы данных несовместимы или хуже, вставьте плохие данные. Включение плохих данных особенно плохо, потому что вы не можете узнать, что это происходит в течение недель или даже месяцев.
Лучший способ - явно указать все имена столбцов как в 'select', так и' insert'. Зачем рисковать получить вещи в неправильном порядке? –
Существует множество инструментов SQL Server, которые могут помочь устранить боль. Перетаскивание таблицы в окно SQL Studio Management позволит вам быстро построить инструкцию SELECT со всеми именами полей, например. Или на стороне сервера, если вы хотите скопировать данные из одной таблицы в другую, интерфейс перетаскивания SSIS и автоматическое сопоставление имен столбцов могут облегчить жизнь. –
Несвязанные, но: круглые скобки вокруг списка столбцов в инструкции 'select' абсолютно бесполезны –