Вставить много значений в таблицу SQL Server

#sql #sql-server-2008

#sql #sql-server-2008

Вопрос:

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

 INSERT into Database(field1, field2,...field100) VALUES(val1, val2,...val3)
  

Я получаю эти значения из текстовых полей и выпадающих списков и аналогичных элементов управления. Это единственный способ сделать это или есть простой способ сделать это? Я не очень хорошо разбираюсь в SQL Server. Я пытаюсь это изучить. Я использую C # 4.0, SQL Server 2008 Express.

Редактировать

Позвольте мне объяснить вопрос интервьюируемого. Если быть точным, они спросили меня об этом, у них была форма для заполнения пользователем (в winforms). Эта форма была разделена на несколько страниц вкладок (5-6) в элементе управления вкладками. Теперь они хотели передавать данные в базу данных одним щелчком мыши, они не хотели отправлять данные постранично. Скорее они хотели передать данные одним нажатием кнопки. Либо полные данные, либо нет.

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

Но немедленный ответ был: «Транзакция в порядке, но вы напишете все значения текстовых полей в команде insert?»

Я сказал, что если что-то равно нулю, я буду игнорировать, но все временные значения не могут быть нулевыми, поскольку разные пользователи будут заполнять форму по-разному. Поэтому лучше включить все значения текстовых полей (или параметры sql) в нашу команду SQL.

Но вопрос был тот же: «Будете ли вы записывать все значения текстовых полей, если они вообще считаются 100 или 200?»

В замешательстве я ответил «да».

И они не выглядели удовлетворяющими.

По этой причине я спросил в 1 комментарии. Можно ли это сделать с помощью списка. Я имею в виду, если у меня есть все элементы управления, добавленные в список, можем ли мы использовать этот список в любом случае? Но теперь я чувствую, что мы не можем.

И да, они выгнали меня из списка выбранных кандидатов :-)) ЛОЛ, неважно.

Комментарии:

1. Для вашего редактирования «сотни строк», а не «сотни полей», они, вероятно, искали, чтобы вы упомянули SQLBulkCopy

2. ОЧЕНЬ ЖАЛЬ, ЭТО БЫЛИ СОТНИ ПОЛЕЙ. ОДНА ОШИБКА, И СМЫСЛ ВОПРОСА ПОЛНОСТЬЮ ИЗМЕНИЛСЯ. извините. ЗАБЕЙ МЕНЯ ДО СМЕРТИ.

3. для SqlBulkCopy позвольте мне провести некоторое исследование, спасибо

Ответ №1:

Если вы вставляете все столбцы, которые можно вставить в таблицу (т.Е. Столбцы not computed, identity, rowversion), вы можете опустить явный список столбцов и просто выполнить

 INSERT into YourTable
Values(val1, val2,...val3) /*Needs to be in order as per table definition*/
  

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

Предполагая, что все пропущенные столбцы имеют значение null или заданы по умолчанию (если не insert произойдет сбой), вы также можете определить представление с требуемым подмножеством столбцов, после чего вы можете вставить в него без явного перечисления столбцов.

Комментарии:

1. так это единственный способ? Могу ли я использовать какой-либо список (с моими элементами управления) для использования их значений? Я просто спрашиваю, я понятия не имею об этом … спасибо

2. Не совсем уверен, о чем вы спрашиваете. Грамматика INSERT здесь единственные варианты — либо использовать явный список столбцов, либо не использовать его. Если вы его не используете, вам необходимо указать значения для всех невычисляемых столбцов, как указано в моем ответе.

Ответ №2:

Попробуйте использовать этот очень простой способ для пакетной вставки записей в таблицу:

  INSERT INTO (TABLE NAME)
 (COLUMN NAMES)
 SELECT (FIELDS SHOULD MATCH THE COLUMN NAMES PROVIDED) 
 FROM (SOURCE(Could be variable or another table))
  

Комментарии:

1. спасибо.вместо этого вы можете привести мне пример, взяв Employees в виде таблицы с FirstName, LastName, Dept в качестве полей. Будет очень полезно. Все еще большое спасибо

Ответ №3:

Если вы хотите вставить сотни строк за один шаг, вы можете сделать это следующим образом (SQL server 2008):

 INSERT INTO TABLENAME VALUES
(fieldValue, fieldValue, ...),
(fieldValue, fieldValue, ...),
(fieldValue, fieldValue, ...);
  

Ответ №4:

Поскольку вы признались в замешательстве, чего и следовало ожидать в интервью, я подозреваю, что ответ, который они искали, был:

(сокращение вставки с «сотен» до четырех строк по три столбца, просто чтобы упростить запись полностью):

 INSERT INTO Table1 (field1, field2, field3) 
   VALUES (1, 2, 3), 
          (1, 2, 4), 
          (2, 1, 9), 
          (2, 3, 8);
  

Другими словами, я скорее думаю, что вопрос заключался в следующем: «Нужно ли повторять имена столбцов для каждой вставленной строки?» на что ответ отрицательный.

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

 INSERT INTO Table1 
   VALUES (1, 2, 3), 
          (1, 2, 4), 
          (2, 1, 9), 
          (2, 3, 8);
  

Ответ на этот вопрос заключается в том, что использование неявного порядка увеличивает риск получения ошибки, либо очевидной (ошибка вставки), либо более скрытой (вставка выполняется успешно, но значения попадают в неправильные столбцы из-за функции языка преобразования неявных типов SQL).


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

Комментарии:

1. в первом примере мы вставляем несколько значений в столбец. Допустим, 4 значения в каждом столбце?