#sql #sql-server #tsql #sql-server-2017
#sql #sql-сервер #tsql #sql-server-2017
Вопрос:
У меня есть a TableA
с несколькими столбцами в нем, один из которых является Computed
значением, а другой — a DateTime
со значением по умолчанию GETDATE()
.
Затем у меня есть другая таблица, TableA_Staging
, которую я хочу использовать в качестве необработанной таблицы сброса для массовых вставок. Эта таблица выглядит очень похоже, TableA
с несколькими ожидаемыми отличиями, одним из которых является то, что в ней нет Computed
или DateTime
столбца.
После того, как я выполнил массовую вставку в TableA_Staging
, теперь мне нужно переместить данные из TableA_Staging
в TableA
. Я сталкиваюсь с проблемой с этими двумя столбцами. Давайте предположим, что TableA
выглядит следующим образом:
TableA
-----------
TableAId (INT non-unique, non-auto-incrementing PK)
Column1 (String PK)
Column2
ColumnComputed
ColumnDateTime
И…
TableA_Staging
-----------
TableAID (this value populated in C# code)
Column1
Column2
Теперь я пытаюсь сделать это:
INSERT INTO TableA
SELECT TableAID, Column1, Column2 FROM TableA_Staging WHERE TableAID > X
Но я получаю эту ошибку:
Имя столбца или количество предоставленных значений не соответствует определению таблицы.
Я предполагаю, что он жалуется, потому что я ничего не предоставляю для ColumnComputed
или ColumnDateTime
? Но если это так, я не думал, что мне нужно будет предоставлять значения для них, поскольку одно вычисляется, а другое имеет значение по умолчанию.
Комментарии:
1. Чего вы ожидаете?
TableA
имеет 5 столбцов иTableA_Staging
имеет 3 столбца.
Ответ №1:
Вы всегда должны включать столбцы в свой оператор insert, которые вы вставляете из вашего select , в противном случае вам всегда нужно указывать такое же количество столбцов в вашей insert, что и в вашем select.
Также, если ваш tableId является autoincrement / identity, вам не нужно включать это.
INSERT INTO TableA (TableBID, Column1, Column2)
SELECT TableAID, Column1, Column2
FROM TableA_Staging WHERE TableAID > X
Комментарии:
1. ах, точно! Это сработало 🙂 Я отмечу как ответ, когда это позволит мне (через 12 минут)