Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите создать запрос c циклом на MS SQL 2000  (Прочитано 15332 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Demidova Aigul
Гость
« : 15-08-2005 09:23 » 

Всем привет!  Улыбаюсь
Люди, пожалуйста, помогите новичку написать следующий запрос:

в таблице "Referats", состоящей из 13 полей, у меня сейчас около 4000 записей.
Есть одна запись с полем "InventoryID"=9999. Мне нужно с помощью запроса занести в базу 40000 таких же записей; содержимое всех полей должно повторяться, только в поле "InventoryID" вместо 9999 должно к старому значению 9999 должна приписываться буква "К" и номер цикла. Например, при значении цикла=1 в поле "InventoryID" должно быть написано "9999К1", при значении=2 должно быть написано "9999К2" и т.д. до 40000.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 15-08-2005 09:47 » 

А обязательно запрос писать на SQL ?
Может быть, сгенерировать SQL скрипт вида
INSERT INTO MYBASE (FIELD1, ..., FIELD13) VALUES ('9999K1', ...) и так 40000 тысяч раз, затем исполнить скрипт каким-либо SQL клиентом.
« Последнее редактирование: 20-12-2007 14:55 от Алексей1153++ » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Demidova Aigul
Гость
« Ответ #2 : 15-08-2005 10:09 » 

Наверно я не совсем поняла ответ.  Раньше я пыталась занести эти 40000 записей с помощью Delphi (клиентская часть у меня на Delphi), там делала цикл и писала запрос "INSERT INTO ............." . Но занесение данных мне показалось слишком долгим (даже если заносить на нескольких компьютерах одновременно), и я подумала, что может если напрямую написать запрос прямо в SQL Server 2000, тогда дело быстрее пойдет. Вот только нужна помощь в составлении запроса.   
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 15-08-2005 10:27 » 

"InventoryID" - что за тип поля? Если Integer или подобный (автоинкремент), то "К" туда не прилепить.
Ежели строковый, то возможно при помощи SP это осуществитмо. 
Записан

С уважением, Oldy.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 15-08-2005 10:35 » 

Я предполагаю, что исполнение инструкций (statement) INSERT будет работать быстрее любого другого запроса.  Работать будет долго, всё-таки занести 40 тысяч записей -- дело не быстрое.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Demidova Aigul
Гость
« Ответ #5 : 15-08-2005 10:36 » 

Самое первое поле в таблице у меня называется "id", тип "int", identity=yes. Второе поле - "InventoryID", тип "varchar", ключевое поле. Остальные поля - обычные.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 15-08-2005 12:26 » 

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

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Demidova Aigul
Гость
« Ответ #7 : 17-08-2005 04:09 » 

Вот, покопалась и сама нашла ответ с помощью книжки   Улыбаюсь

DECLARE @M int
SET @M=1
WHILE @M < 40000
BEGIN
INSERT INTO Referats (InventoryID , Autors, ReportName, ReportYear, OrgName, OrgAdress, Abstract, KeyWords, ColBooks, ColFolders, ColPervInf, dostup_k_referat)
select ('9999M'+CAST(@M as varchar)), Autors, ReportName, ReportYear, OrgName, OrgAdress, Abstract, KeyWords, ColBooks, ColFolders, ColPervInf, dostup_k_referat
from Referats
where InventoryID = '9999'

SELECT @M=@M+1
END
« Последнее редактирование: 20-12-2007 14:58 от Алексей1153++ » Записан
SergKO
Гость
« Ответ #8 : 30-08-2005 04:47 » new

Лучше с использованием временной таблицы. Будет быстрее, чем цикл. Примерно так:

Код:
DECLARE @Autors 	<тип данных>, 
@ReportName <тип данных>,
и т.д.

SELECT @Autors = Autors, @ReportName = ReportName ...
FROM Referats
WHERE InventoryID = '9999'

SELECT TOP 40000 number = IDENTITY(int, 1, 1)  INTO   #Number FROM   sysobjects t1, sysobjects t2

INSERT INTO Referats (InventoryID, Autors, ReportName ... )
SELECT ('9999M'+CAST(number as varchar)), @Autors, @ReportName ... FROM #Number

« Последнее редактирование: 20-12-2007 14:59 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines