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

Откуда:
Сообщений: 151
Переделываю структуру одной базы и нужно перегнать данные из одной базы в другую. В исходной базе адреса для каждого пользователя хранятся в одной таблице, в новой базе есть ATID - тип адреса, лежит в отдельной таблице с описанием типа адреса.
Пытаюсь написать что-то вроде этого:

ALTER PROCEDURE TO_ADDRESS AS
DECLARE 

--объявление кучи переменных

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 testbaze.dbo.N_Colony
	OPEN C
			FETCH NEXT FROM C INTO @BirthCountryID, @BirthArea, @BirthRegion, @BirthCity, @previosArea, @previosRegion, @previosCity, @previosHome, @AddressIndex, @addressCountryID, @PreviosAddressPlace, @addressregion, @PreviosAddressPlace, @addressArea, @addressRegion, @addressCity, @addressHome, @birthCountryID, @birthArea, @BirthRegion, @BirthCity, @REGDATE
			WHILE @@FETCH_STATUS = 0
			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
			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
			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 
CLOSE C 
DEALLOCATE C


Ошибка выскакивает такая:
Сообщение 16924, уровень 16, состояние 1, процедура TO_ADDRESS, строка 26
Выборка курсора: количество переменных, объявленных в списке INTO, должно совпадать с количеством выбранных столбцов.
14 авг 12, 01:18    [13006859]     Ответить | Цитировать Сообщить модератору
 Re: Не могу раскидать адреса по типам.  [new]
qwerty112
Guest
BirthCountryID, BirthArea, BirthRegion, BirthCity, previosArea, previosRegion, previosCity, previosHome, AddressIndex, addressCountryId,   PreviosAddressPlaceID,                      PreviosAddressPlace, addressArea, addressRegion, addressCity, addressHome, birthCountryID, birthArea, BirthRegion, BirthCity, regdate
BirthCountryID, BirthArea, BirthRegion, BirthCity, previosArea, previosRegion, previosCity, previosHome, AddressIndex, addressCountryID,   PreviosAddressPlace,   addressregion,       PreviosAddressPlace, addressArea, addressRegion, addressCity, addressHome, birthCountryID, birthArea, BirthRegion, BirthCity, REGDATE
14 авг 12, 01:33    [13006867]     Ответить | Цитировать Сообщить модератору
 Re: Не могу раскидать адреса по типам.  [new]
kim-kong
Member

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

Блин, чувствую себя слепым, огромное спасибо !
14 авг 12, 15:12    [13009628]     Ответить | Цитировать Сообщить модератору
 Re: Не могу раскидать адреса по типам.  [new]
kim-kong
Member

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

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

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 != NULL
			if @PreviosCountryID != NULL
			if @AddressCountryId != 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
			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
			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
END 
CLOSE C DEALLOCATE C


Но в результате ничего не хочет заноситься.
14 авг 12, 15:45    [13009936]     Ответить | Цитировать Сообщить модератору
 Re: Не могу раскидать адреса по типам.  [new]
qwerty112
Guest
kim-kong,

if @BirthCountryID is not NULL
14 авг 12, 15:49    [13009971]     Ответить | Цитировать Сообщить модератору
 Re: Не могу раскидать адреса по типам.  [new]
kim-kong
Member

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

...
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
			if @PreviosCountryID is not NULL
			if @AddressCountryId is not NULL
			BEGIN
....


так тоже пробовал, процедура виснет и все
14 авг 12, 20:02    [13011373]     Ответить | Цитировать Сообщить модератору
 Re: Не могу раскидать адреса по типам.  [new]
qwerty112
Guest
kim-kong,

у тебя, в цикле нет FETCH-а,
поэтому цикл бесконечный

и вообще, - код наркоманский
весь этот "ахтунг" можно сделать 3-мя запросами "не думая"
или 1-им - "думая"
14 авг 12, 20:21    [13011440]     Ответить | Цитировать Сообщить модератору
 Re: Не могу раскидать адреса по типам.  [new]
kim-kong
Member

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

fetch есть, я его в первый раз забыл написать, потом опомнился.

	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 NPZU2.dbo.N_Colony
	OPEN C
	--не добавлять нулевые строки !
			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
			if @PreviosCountryID is not NULL
			if @AddressCountryId 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
			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
			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
			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
END 
CLOSE C DEALLOCATE C
14 авг 12, 22:08    [13011876]     Ответить | Цитировать Сообщить модератору
 Re: Не могу раскидать адреса по типам.  [new]
qwerty112
Guest
kim-kong
qwerty112,

fetch есть, я его в первый раз забыл написать, потом опомнился.

	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 NPZU2.dbo.N_Colony
	OPEN C
	--не добавлять нулевые строки !
			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
			if @PreviosCountryID is not NULL
			if @AddressCountryId 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
			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
			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
			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
END 
CLOSE C DEALLOCATE C

если какое-то из этих условий НЕ выполнится - "клинч" ))

вообще, достаточно код оформлять отступами, что бы такие "децкие" ошибки были видны сразу
14 авг 12, 22:18    [13011900]     Ответить | Цитировать Сообщить модератору
 Re: Не могу раскидать адреса по типам.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
qwerty112
вообще, достаточно код оформлять отступами, что бы такие "децкие" ошибки были видны сразу
+1
Иногда такое впечатление, что люди выдумывают правила оформления гнератором случайных чисел, ну или просто лишь бы изменить, лишь бы в проекте разные куски были в разном стиле. А вроде всё давно придумано в оформлении кода, лет эдак 30 назад.

И весь код процедуры - один простой insert, как уже сказали.
14 авг 12, 23:36    [13012106]     Ответить | Цитировать Сообщить модератору
 Re: Не могу раскидать адреса по типам.  [new]
kim-kong
Member

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

			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
				set @ATId=2
			END
			
			if @PreviosCountryID is not NULL
			Begin
				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
				set @ATId=3
			END
			
			if @AddressCountryId is not NULL
			BEGIN
				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

			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


Я, если честно, сам немного себя не понимаю )
21 авг 12, 02:17    [13040584]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить