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

Откуда:
Сообщений: 142
Приветствую!
Кто-нибудь сориентирует что MS SQL 2008 R2 не нравится:


ALTER PROCEDURE [dbo].[usp_FindEndAccessPoint]
(
	@AccessPointID int
)
AS
BEGIN

	if exists(Select AccessPointID From AccessPoints Where ParentAccessPointID = @AccessPointID)
	begin
		--есть чайлды
		declare @AccessP int
		declare parent_cursor cursor for
		Select AccessPointID From AccessPoints Where ParentAccessPointID = @AccessPointID

		open parent_cursor
		fetch next from parent_cursor into @AccessP --Вот здесь выдает ошибку: Необходимо объявить скалярную переменную "@AccesP".
		while @@FETCH_STATUS = 0
		begin
			print @AccessP
			exec [dbo].[usp_FindEndAccessPoint] @AccessPointID=@AccesP
			fetch next from parent_cursor into @AccessP
		end
		close parent_cursor
		deallocate parent_cursor
	end
	else
	begin
		--конечный узел
		insert into ##EndPoints Values (@AccessPointID)
	end
END
GO


Заранее благодарен!
5 ноя 13, 15:48    [15079576]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивная процедура - где грабли?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
zolitude
			--Вот здесь выдает ошибку: Необходимо объявить скалярную переменную "@AccesP"
			exec [dbo].[usp_FindEndAccessPoint] @AccessPointID=@AccessP
5 ноя 13, 15:52    [15079615]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивная процедура - где грабли?  [new]
aleks2
Guest
1. DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
2. Рекурсия - зло.
5 ноя 13, 15:52    [15079616]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивная процедура - где грабли?  [new]
Гость333
Member

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

А вообще, используйте рекурсивный CTE.
5 ноя 13, 15:55    [15079641]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивная процедура - где грабли?  [new]
zolitude
Member

Откуда:
Сообщений: 142
Семен Семеныч...
Спасибо! )
5 ноя 13, 16:01    [15079692]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивная процедура - где грабли?  [new]
Glory
Member

Откуда:
Сообщений: 104760
zolitude
		fetch next from parent_cursor into @AccessP --Вот здесь выдает ошибку: Необходимо объявить скалярную переменную "@AccesP".

Msg 137, Level 15, State 2, Procedure usp_FindEndAccessPoint, Line 20
Must declare the scalar variable "@AccesP".

А Line 20 это
exec [dbo].[usp_FindEndAccessPoint] @AccessPointID=@AccesP
5 ноя 13, 16:04    [15079718]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивная процедура - где грабли?  [new]
zolitude
Member

Откуда:
Сообщений: 142
Гость333
zolitude,

А вообще, используйте рекурсивный CTE.


Хорошая тема, спасибо!
делаю так:

WITH CTE AS 
(
-- Anchor member definition
    SELECT ParentAccessPointID, AccessPointID, 0 AS Level,
    CAST(AccessPointID as varchar(100)) AS Hierarchy
    FROM AccessPoints WHERE ParentAccessPointID IS NULL
    UNION ALL
-- Recursive member definition
    SELECT AP.ParentAccessPointID, AP.AccessPointID, Level + 1,
    CAST(Hierarchy + ':' + CAST(AP.AccessPointID as varchar(100)) as varchar(100)) as Hierarchy
    FROM AccessPoints AS AP
    INNER JOIN CTE AS DR ON AP.ParentAccessPointID = DR.AccessPointID
)
-- Statement that executes the CTE
SELECT ParentAccessPointID, AccessPointID, Hierarchy, Level
FROM CTE
OPTION (Maxrecursion 10000) 
--WHERE Level = 0;
GO


А есть ли способ, помимо классической рекурсии, выбрать только конечные элементы в иерархии?
5 ноя 13, 17:32    [15080234]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивная процедура - где грабли?  [new]
Glory
Member

Откуда:
Сообщений: 104760
zolitude
А есть ли способ, помимо классической рекурсии, выбрать только конечные элементы в иерархии?

Листовой элемеит - это элемент, который не является родителем
5 ноя 13, 17:36    [15080263]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивная процедура - где грабли?  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
zolitude
А есть ли способ, помимо классической рекурсии, выбрать только конечные элементы в иерархии


Конечные - это в смысле листовые, не имеющие потомков?
 SELECT AP1.*
 FROM AccessPoints AP1
         LEFT JOIN AccessPoints AP2
         ON AP1.AccessPointID = AP2.ParentAccessPointID 
WHERE AP2.ParentAccessPointID  is null

Hierarchy и Level не будет, правда.
5 ноя 13, 17:41    [15080291]     Ответить | Цитировать Сообщить модератору
 Re: рекурсивная процедура - где грабли?  [new]
zolitude
Member

Откуда:
Сообщений: 142
Кот Матроскин, спасибо большое!
Будет, если саму CTE джойнить...
5 ноя 13, 18:30    [15080545]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить