2009-09-08 5 views
1

Я хотел бы иметь возможность вставлять некоторые значения в таблицу с помощью одного оператора INSERT, но у меня возникают проблемы с определением наилучшего способа. Данные, которые я вставляю, являются загрузочными (или жестко закодированными) данными, т.е. недоступны в другой таблице. Вот что я пробовал до сих пор.Группировка значений для INSERTION в таблице

create table #t (id int) 

insert into #t values (1) --- (a) 
insert into #t values (5) --- (a) 

insert into #t values ((5), (3), (22)) --- (b) 

insert into #t    --- (c) 
select 3 union all 
select 5 union all 
select 6 union all 
select 8 

Код в (a) отлично работает, но добавляет только одно значение для каждой вставки.

Код в (b) представляется логическим расширением (a) для меня (по крайней мере, когда я думаю об инициализаторах из Perl или Java), но не работает.

Код на (c) работает и, вероятно, является скорее способом SQL, но кажется многословным.

Существует ли вариант (б), который работает? Или существует подход, подобный (c), который требует меньше набора текста?

Я использую SQL Server 2000, но меня интересует что-то довольно портативное, если это возможно.

ОБНОВЛЕНИЕ: Спасибо каждому, кто ответил. Таким образом, кажется, что в стандарте SQL есть многопользовательская вставка, что и было, но не поддерживается в моей среде. Поэтому я буду придерживаться (а) для простоты и ясности.

+1

Можете ли вы рассказать нам о причинах вставки таким образом, может быть лучшее решение, чем использование вставки. –

ответ

0

Стандарта SQL предусматривает несколько списков значений, каждый в своем собственном наборе скобок, который является несовершеннолетними вариантами на ваш (б):

INSERT INTO "#t" VALUES (1), (2), (3); 

Не все СУБД поддерживают эту запись, хотя, и я был бы удивлен, если SQL Server 2000 и сделал.

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

+0

@dave указывает, что он находится на SQL-сервере-2000. Многопозиционная вставка недоступна. –

+0

Попробовав, я могу подтвердить, что SQL Server 2000 не поддерживает multi-insert. Я не был после выступления, просто ясность и краткость кода. – dave

0

Существует ли вариант (b), который работает?

INSERT может вставлять только одну строку за раз. Если вы хотите вставить несколько строк, вам придется называть это много раз. Короче говоря, нет.

Или есть подобный подход (с), что требует меньше печатать?

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

Если ваши данные жестко закодированы, и вы ищете массовый импорт, вы можете посмотреть в BULK INSERT. Вы можете использовать BULK INSERT для чтения CSV data.

+0

При этом код в (c) взаимодействует с сервером один раз, тогда как вызов кода в (a) несколько раз связывается с сервером несколько раз, я подозреваю, что, если вы не можете отключить круглые поездки между программой и сервером, Код UNION выйдет из-за кода с несколькими INSERT. –

+0

Очевидно, что это зависит от среды, но если размер объединения больше, чем системная память, и сервер начинает записывать на диск на диске, я сомневаюсь, что латентность сети станет узким местом. –

+0

@Ben: Хорошо, да, это несколько зависит от окружающей среды; если вы общаетесь с СУБД через WAN, ответ будет отличаться от того, работаете ли вы на том же компьютере, что и СУБД. В наши дни ограничение на размер в выражении SQL (32 КБ - 2 МБ, грубо говоря, в зависимости от СУБД) является скорее проблемой, чем данными, представленными UNION. Один оператор, по-прежнему, может быть более эффективным, чем многократные поездки между приложением и сервером, если только не существует способов группировать заявления как партию операторов, о которых я не знаю, что является возможностью. –

-1

Ну, вы могли бы вставить во временную таблицу и затем выполните следующие действия:

INSERT INTO ... 
SELECT FROM ... 
+1

Предупреждение: проблема с курицей и яйцом. –

+0

Я действительно прочитал, что услышал голос компьютера от звездного трека в моей голове. –

+0

Да, да, я знаю. –

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