#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 строк; не будет никаких проблем с загрузкой огромного файла с помощью массовой загрузки.
Комментарии:
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' ) Вперед