Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Теряются данные при переносе из одной таблицы в другую  [new]
kim-kong
Member

Откуда:
Сообщений: 151
Заносится только 40 записей из 17000, при этом, начиная с PID=8, а не с 1. Курсор упорно не хочет доходить до конца таблицы.

--куча объявлений
set @AID=1
set @NULL=NULL
set @PId=1
	DECLARE C CURSOR 
	FOR SELECT BirthCountryID, BirthArea, BirthRegion, BirthCity, previosArea, previosRegion, previosCity, previosHome, AddressIndex, addressCountryId, PreviosAddressPlaceID, PreviosAddressPlace, addressArea, addressRegion, addressCity, addressHome, birthCountryID, birthArea, BirthRegion, BirthCity, regdate
	FROM TestBase.dbo.N_Colony
	OPEN C
	--не добавлять нулевые строки !
	set @PId=1
			FETCH NEXT FROM C INTO @BirthCountryID, @BirthArea, @BirthRegion, @BirthCity, @previosArea, @previosRegion, @previosCity, @previosHome, @AddressIndex, @addressCountryId, @PreviosAddressPlaceID, @PreviosAddressPlace, @addressArea, @addressRegion, @addressCity, @addressHome, @birthCountryID, @birthArea, @BirthRegion, @BirthCity, @regdate
			WHILE @@FETCH_STATUS = 0
			BEGIN
			
			if @BirthCountryID is not NULL
			Begin
				set @ATId=1
				INSERT INTO A_Addresses(PId, AId, ATId, CountryId, Area, Region, City, Home, PostIndex, RegDate, EndDate, Place)
				VALUES (@PID, @AID, @ATID, @BirthCountryID, @BirthArea, @BirthRegion, @BirthCity, @NULL, @NULL, @RegDate, @EndDate, @BirthPlace)
				set @AID=@AID+1
			END

			if @PreviosCountryID is not NULL
			Begin
				set @ATId=2
				INSERT INTO A_Addresses(PId, AId, ATId, CountryId, Area, Region, City, Home, PostIndex, RegDate, EndDate, Place)
				VALUES (@PID, @AID, @ATID, @PreviosCountryId, @PreviosArea, @PreviosRegion, @PreviosCity, @PreviosHome, @NULL, @RegDate, @EndDate, @PreviosAddressPlace)
				set @AID=@AID+1
			END
		
			if @AddressCountryId is not NULL
			BEGIN
				set @ATId=3
				INSERT INTO A_Addresses(PId, AId, ATId, CountryId, Area, Region, City, Home, PostIndex, RegDate, EndDate, Place)
				VALUES (@PID, @AID, @ATID, @AddressCountryId, @AddressArea, @AddressRegion, @AddressCity, @AddressHome, @PostIndex, @RegDate, @EndDate, @NULL)
				set @AID=@AID+1
				set @PID=@PID+1
			END
			Else
			Begin
				FETCH NEXT FROM C INTO @BirthCountryID, @BirthArea, @BirthRegion, @BirthCity, @previosArea, @previosRegion, @previosCity, @previosHome, @AddressIndex, @addressCountryId, @PreviosAddressPlaceID, @PreviosAddressPlace, @addressArea, @addressRegion, @addressCity, @addressHome, @birthCountryID, @birthArea, @BirthRegion, @BirthCity, @regdate
			End
			FETCH NEXT FROM C INTO @BirthCountryID, @BirthArea, @BirthRegion, @BirthCity, @previosArea, @previosRegion, @previosCity, @previosHome, @AddressIndex, @addressCountryId, @PreviosAddressPlaceID, @PreviosAddressPlace, @addressArea, @addressRegion, @addressCity, @addressHome, @birthCountryID, @birthArea, @BirthRegion, @BirthCity, @regdate
END 
CLOSE C DEALLOCATE C
23 авг 12, 04:14    [13052850]     Ответить | Цитировать Сообщить модератору
 Re: Теряются данные при переносе из одной таблицы в другую  [new]
aleks2
Guest
Эта он тибе кагбе намекает: а нафига здесь курсор?

ЗЫ. Ну, если дебаггер не освоил, воткни select/print посля каждого FETCH NEXT FROM и "ты увидишь, ты узнаешь...".
23 авг 12, 05:08    [13052886]     Ответить | Цитировать Сообщить модератору
 Re: Теряются данные при переносе из одной таблицы в другую  [new]
kim-kong
Member

Откуда:
Сообщений: 151
aleks2,

курсор я использую, чтобы сделать новые столбцы PID и AID.
23 авг 12, 05:56    [13052902]     Ответить | Цитировать Сообщить модератору
 Re: Теряются данные при переносе из одной таблицы в другую  [new]
kim-kong
Member

Откуда:
Сообщений: 151
kim-kong,

да и от NULLевых значений в CountryID надо как то избавляться.
23 авг 12, 06:00    [13052903]     Ответить | Цитировать Сообщить модератору
 Re: Теряются данные при переносе из одной таблицы в другую  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
kim-kong
aleks2,

курсор я использую, чтобы сделать новые столбцы PID и AID.

для этого есть функция ROW_NUMBER()

А задача -то какая ? Ибо алгоритм и реализация уж очень того, кривые.
23 авг 12, 06:00    [13052904]     Ответить | Цитировать Сообщить модератору
 Re: Теряются данные при переносе из одной таблицы в другую  [new]
kim-kong
Member

Откуда:
Сообщений: 151
Ken@t,

Переделываю структуру одной базы и нужно перегнать данные из одной базы в другую. В исходной базе адреса для каждого пользователя хранятся в одной таблице, в новой базе есть ATID - тип адреса, лежит в отдельной таблице с описанием типа адреса. Соответственно, в новой таблице может быть 3 записи с одинаковыми PID, но AID у них будут разные.
23 авг 12, 06:09    [13052907]     Ответить | Цитировать Сообщить модератору
 Re: Теряются данные при переносе из одной таблицы в другую  [new]
aleks2
Guest
kim-kong
Ken@t,

Переделываю структуру одной базы и нужно перегнать данные из одной базы в другую. В исходной базе адреса для каждого пользователя хранятся в одной таблице, в новой базе есть ATID - тип адреса, лежит в отдельной таблице с описанием типа адреса. Соответственно, в новой таблице может быть 3 записи с одинаковыми PID, но AID у них будут разные.

Фсяко это не аргумент за курсор. Три инсерта и фсе.
23 авг 12, 06:56    [13052922]     Ответить | Цитировать Сообщить модератору
 Re: Теряются данные при переносе из одной таблицы в другую  [new]
aleks2
Guest
Что-то навроде
INSERT INTO A_Addresses(PId, AId, ATId, CountryId, Area, Region, City, Home, PostIndex, RegDate, EndDate, Place)
select PID = 1, AID = row_number() over(order by RegDate), ATID = 1
     , BirthCountryID, BirthArea, BirthRegion, BirthCity, NULL, NULL, RegDate, EndDate, BirthPlace
  FROM TestBase.dbo.N_Colony
  where BirthCountryID is not NULL

set @AID=@@rowcount;

INSERT INTO A_Addresses(PId, AId, ATId, CountryId, Area, Region, City, Home, PostIndex, RegDate, EndDate, Place)
select PID = 1, AID = @AID+row_number() over(order by RegDate), ATID = 2
     , PreviosCountryId, PreviosArea, PreviosRegion, PreviosCity, PreviosHome, NULL, RegDate, EndDate, PreviosAddressPlace
  FROM TestBase.dbo.N_Colony
  where PreviosCountryID is not NULL

set @AID=@AID+@@rowcount;

INSERT INTO A_Addresses(PId, AId, ATId, CountryId, Area, Region, City, Home, PostIndex, RegDate, EndDate, Place)
select PID = row_number() over(order by RegDate), AID = @AID+row_number() over(order by RegDate), ATID = 3
     , AddressCountryId, AddressArea, AddressRegion, AddressCity, AddressHome, PostIndex, RegDate, EndDate, @NULL
  FROM TestBase.dbo.N_Colony
  where AddressCountryId is not NULL

и фсе.
23 авг 12, 08:22    [13052975]     Ответить | Цитировать Сообщить модератору
 Re: Теряются данные при переносе из одной таблицы в другую  [new]
kim-kong
Member

Откуда:
Сообщений: 151
aleks2,

Блин, у меня все работало правильно, спасибо за советы )
23 авг 12, 10:20    [13053337]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить