Как я могу вставить 100000 строк в SQL Server?

#sql #sql-server #sql-server-2008

#sql #sql-server #sql-server-2008

Вопрос:

 INSERT INTO pantscolor_t (procode, color, pic) 
VALUES
('74251', 'Black', '511black.jpg'),
('74251', 'OD Green', '511odgreen.jpg'),
('74251', 'Black', '511black.jpg'),
('74251', 'OD Green', '511odgreen.jpg'),
('74251', 'Black', '511black.jpg'),
('74251', 'OD Green', '511odgreen.jpg'),
..........
..........
..........

INSERT INTO pantscolor_t (procode,color,pic)
VALUES
('74251', 'Charcoal', '511charcoal.jpg'),
('74251', 'Charcoal', '511charcoal.jpg'),
('74251', 'Charcoal', '511charcoal.jpg'),
('74251', 'Charcoal', '511charcoal.jpg'),
.............
.............
.............

 INSERT INTO........................
 INSERT INTO........................
 INSERT INTO........................
 INSERT INTO........................
  

У меня есть 100000 таких строк, но мои операторы insert больше 1000 строк. Когда я запускаю инструкцию SQL в SSMS, я получаю сообщение об ошибке:

Количество выражений значений строк в инструкции INSERT превышает максимально допустимое количество значений 1000 строк.

Ответ №1:

Другим решением является использование запроса select с объединениями.

 INSERT INTO pantscolor_t (procode,color,pic)
SELECT '74251', 'Black', '511black.jpg'
UNION ALL SELECT '74251', 'OD Green', '511odgreen.jpg'
UNION ALL SELECT '74251', 'Black', '511black.jpg'
UNION ALL SELECT '74251', 'OD Green', '511odgreen.jpg'
UNION ALL SELECT '74251', 'Black', '511black.jpg'
UNION ALL SELECT '74251', 'OD Green', '511odgreen.jpg'
--etc....
  

UNION ALL используется вместо UNION того, чтобы ускорить запрос при работе с тысячами записей. UNION ALL допускает повторяющиеся строки, тогда UNION как гарантирует, что дубликаты не существуют в результирующем наборе. Для этого сценария мы не хотим удалять любые возможные дубликаты, поэтому UNION ALL используется so.

Ответ №2:

Создайте csv-файл (или какой-либо файл с определенным разделителем полей и разделителем строк) и используйте опцию «МАССОВАЯ ВСТАВКА» для загрузки файла в базу данных. Файл может содержать 100000 строк; не будет никаких проблем с загрузкой огромного файла с помощью массовой загрузки.

http://msdn.microsoft.com/en-us/library/ms188365.aspx

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

1. 1 Из кода вы можете использовать класс SqlBulkCopy

2. Тогда я думаю; это будет легко преобразовать в файл csv.

3. Вы также можете использовать bcp.exe : bcp mytable in data.txt -S (local) -d mydatabase -T -c (-T для проверяемого соединения, -c для символьных данных вы можете использовать его для файлов, разделенных табуляцией. Вы можете увидеть другие варианты, bcp --help например, -t для поля -r для завершения строки, если ваши данные не разделены табуляцией или разделены табуляцией)

Ответ №3:

 INSERT mytable (col1, col2, col3, col4, col5, col6)
SELECT * FROM (VALUES
('1502577', '0', '114', 'chodba', 'Praha', 'Praha 1'),
('1503483', '0', 'TVP', 'chodba', 'Praha', 'Praha 2'),
/* ... more than 1000 rows ... */
('1608107', '0', '8', 'sklad', 'Tlumačov', 'Tlumačov'),
('1608107', '0', '9', 'sklad', 'Tlumačov', 'Tlumačov')
) AS temp (col1, col2, col3, col4, col5, col6);
  

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

1. Это полезно при построении запроса в цикле. Сработало!. Спасибо

2. Спасатель, спасибо!

3. Спасибо! Вот некоторый конструктор значений ссылочной таблицы

Ответ №4:

Применяя следующее, у вас не должно быть никаких ошибок :

 INSERT INTO pantscolor_t (procode,color,pic) VALUES ('74251','Black','511black.jpg')

INSERT INTO pantscolor_t (procode,color,pic) VALUES ('74251', 'OD Green', '511odgreen.jpg')

INSERT INTO pantscolor_t (procode,color,pic) VALUES ('74251', 'Black', '511black.jpg')

INSERT INTO pantscolor_t (procode,color,pic) VALUES ('74251', 'OD Green', '511odgreen.jpg')

INSERT INTO pantscolor_t (procode,color,pic) VALUES ('74251', 'Black', '511black.jpg')

...........
  

Я попробовал, и это сработало, конечно, вы можете использовать Excel для простого объединения значений.

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

1. Это был бы довольно медленный процесс

Ответ №5:

Создайте файл csv out.csv и т.
Д., Затем используйте:

МАССОВАЯ ВСТАВКА 
ИЗ 'C:out.csv '
С
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = 'n'
)
Вперед