ВСТАВИТЬ В таблицу с вычисляемыми значениями и значениями по умолчанию

#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 минут)