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

Откуда: Москва
Сообщений: 206
Ф-ия взята из практикума для подготовки к 70-433 глава 4.1 "Building Recursive Queries with CTE" взята только сама ф-ия без участка кода с местом ее вызова, он не нужен.
WITH EMP_cte(BusinessEntityID, OrganizationNode, FirstName, LastName,
JobTitle, RecursionLevel)
AS (

SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName,
p.LastName, e.JobTitle, 0
FROM HumanResources.Employee e 
INNER JOIN Person.Person as p
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.BusinessEntityID = @EmployeeToGetOrgFor

UNION ALL

SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName,
e.JobTitle, RecursionLevel + 1
FROM HumanResources.Employee e 
INNER JOIN EMP_cte
ON e.OrganizationNode = EMP_cte.OrganizationNode.GetAncestor(1)
INNER JOIN Person.Person p 
ON p.BusinessEntityID = e.BusinessEntityID
)


Мне не ясно как передается параметр во время каждого вызова ф-ий самой себя. Под параметром я понимаю нечто характеризующее уровень рекурсии в текущем вызове. С SQL языками не знаком, привык что это делается в открытую. Очевидно что ключ лежит в понимании:
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName,
e.JobTitle, RecursionLevel + 1
FROM HumanResources.Employee e 
INNER JOIN EMP_cte
ON e.OrganizationNode = EMP_cte.OrganizationNode.GetAncestor(1)

Как я понимаю этот код:
1) Извлекаются все записи из HumanResources.Employee
2) Идет вызов EMP_cte самой себя(если идет передача параметра то я ее не вижу: ни как он передается, ни как он принимается)
3) Идет определения пересечения e.OrganizationNode = EMP_cte.OrganizationNode.GetAncestor(1)
21 фев 13, 13:04    [13960393]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37077
Какого еще такого параметра? Cte - это не функция.
21 фев 13, 13:08    [13960428]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MaxNevermind
Ф-ия взята из практикума для подготовки к 70-433 глава 4.1

А где здесь функция ?? Это просто рекурсивный запрос.

MaxNevermind
Как я понимаю этот код:
1) Извлекаются все записи из HumanResources.Employee
2) Идет вызов EMP_cte самой себя(если идет передача параметра то я ее не вижу: ни как он передается, ни как он принимается)
3) Идет определения пересечения e.OrganizationNode = EMP_cte.OrganizationNode.GetAncestor(1)

Посмотрите план выполнения
21 фев 13, 13:10    [13960440]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
WITH EMP_cte
AS (

SELECT 

UNION ALL

SELECT 
FROM HumanResources.Employee e 
INNER JOIN EMP_cte
ON e.OrganizationNode = EMP_cte.OrganizationNode.GetAncestor(1)


Это собственно и есть рекурсия. А GetAncestor(1) это просто метод нового типа SqlHierarchyId .
21 фев 13, 13:12    [13960454]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Мистер Хенки,

тип-то, всё-таки, называется hierarchyid

GetAncestor
21 фев 13, 13:15    [13960476]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
iap
Мистер Хенки,

тип-то, всё-таки, называется hierarchyid

GetAncestor

ну да, точно.
21 фев 13, 13:17    [13960503]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
MaxNevermind
Member

Откуда: Москва
Сообщений: 206
Гавриленко Сергей Алексеевич
Какого еще такого параметра? Cte - это не функция.

Ок, понял, ошибся
21 фев 13, 13:17    [13960508]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
MaxNevermind
Member

Откуда: Москва
Сообщений: 206
Glory
MaxNevermind
Ф-ия взята из практикума для подготовки к 70-433 глава 4.1

А где здесь функция ?? Это просто рекурсивный запрос.

MaxNevermind
Как я понимаю этот код:
1) Извлекаются все записи из HumanResources.Employee
2) Идет вызов EMP_cte самой себя(если идет передача параметра то я ее не вижу: ни как он передается, ни как он принимается)
3) Идет определения пересечения e.OrganizationNode = EMP_cte.OrganizationNode.GetAncestor(1)

Посмотрите план выполнения


Не могу посмотреть, не дошел еще до его изучения
21 фев 13, 13:18    [13960512]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
MaxNevermind
Member

Откуда: Москва
Сообщений: 206
Мистер Хенки
[src]
...А GetAncestor(1) это просто метод нового типа SqlHierarchyId .

знаю

Мистер Хенки
[src]
...
Это собственно и есть рекурсия... .

То есть это просто очередной вызов рекурсивного запроса? В точно таком виде каком он был только что вызван?
21 фев 13, 13:21    [13960540]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MaxNevermind
То есть это просто очередной вызов рекурсивного запроса? В точно таком виде каком он был только что вызван?

Вас интересует логика запроса ? Или то, как сервер ее реализует ?
21 фев 13, 13:23    [13960561]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
MaxNevermind
Member

Откуда: Москва
Сообщений: 206
Glory
MaxNevermind
То есть это просто очередной вызов рекурсивного запроса? В точно таком виде каком он был только что вызван?

Вас интересует логика запроса ? Или то, как сервер ее реализует ?

Пока что первое.
21 фев 13, 13:26    [13960595]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
MaxNevermind

...

То есть это просто очередной вызов рекурсивного запроса? В точно таком виде каком он был только что вызван?

Ну как обьяснить. Здесь рекурсия на множестве.
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName,
p.LastName, e.JobTitle, 0
FROM HumanResources.Employee e 
INNER JOIN Person.Person as p
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.BusinessEntityID = @EmployeeToGetOrgFor

это как бы входной параметр для рекурсии, все записи с которых мы начнем рекурсию и условно выражаясь положим их в EMP_cte

SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName,
e.JobTitle, RecursionLevel + 1
FROM HumanResources.Employee e 
INNER JOIN EMP_cte
ON e.OrganizationNode = EMP_cte.OrganizationNode.GetAncestor(1)
INNER JOIN Person.Person p 
ON p.BusinessEntityID = e.BusinessEntityID

а это собственно правило которое мы будем выполнять рекурсивно на записях из EMP_cte. Находить новые записи, складывать их в EMP_cte и уже к ним снова применять это правило и т.д. пока этот запрос хоть чего то возвращает.
21 фев 13, 13:37    [13960693]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MaxNevermind
Пока что первое.

Pseudocode and Semantics
The recursive CTE structure must contain at least one anchor member and one recursive member. The following pseudocode shows the components of a simple recursive CTE that contains a single anchor member and single recursive member.

WITH cte_name ( column_name [,...n] )
AS
(
CTE_query_definition –- Anchor member is defined.
UNION ALL
CTE_query_definition –- Recursive member is defined referencing cte_name.
)
-- Statement using the CTE
SELECT *
FROM cte_name

The semantics of the recursive execution is as follows:

Split the CTE expression into anchor and recursive members.
Run the anchor member(s) creating the first invocation or base result set (T0).
Run the recursive member(s) with Ti as an input and Ti+1 as an output.
Repeat step 3 until an empty set is returned.
Return the result set. This is a UNION ALL of T0 to Tn.
21 фев 13, 13:37    [13960694]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
MaxNevermind
Как я понимаю этот код:
1) Извлекаются все записи из HumanResources.Employee
2) Идет вызов EMP_cte самой себя(если идет передача параметра то я ее не вижу: ни как он передается, ни как он принимается)
3) Идет определения пересечения e.OrganizationNode = EMP_cte.OrganizationNode.GetAncestor(1)

Рекурсия тут идёт в другую сторону.

1) Вычисляется результат нерекурсивной части, т.е.
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName,
p.LastName, e.JobTitle, 0
FROM HumanResources.Employee e 
INNER JOIN Person.Person as p
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.BusinessEntityID = @EmployeeToGetOrgFor

2) Полученный набор данных передаётся в рекурсивную часть, и используется в качестве промежуточной таблицы EMP_cte (INNER JOIN EMP_cte ON ...). То есть передаётся не "параметр функции", а набор данных;

3) Если на выходе п.2 есть непустой набор данных и не достигнут предельный уровень рекурсии (MAXRECURSION), то этот набор передаётся на вход п.2;

4) Все наборы данных, полученные на каждом уровне рекурсии, объединяются в итоговый набор.

Вот, предположим, мы хотим найти всех начальников у некоего Иванова. На первом уровне рекурсии мы получаем набор данных, содержащий самого Иванова:
LastName JobTitle RecursionLevel
Иванов Программист 0

RecursionLevel = 0 — это константа из нерекурсивной части.

Этот набор поступает на вход второго уровня рекурсии, на выходе которого получаем набор данных, содержащий начальника Иванова:
LastName JobTitle RecursionLevel
Петров Начальник отдела 1

RecursionLevel = 1 — это результат выражения "RecursionLevel + 1".

Этот набор поступает на вход третьего уровня рекурсии, на выходе которого получаем набор данных, содержащий начальника Петрова:
LastName JobTitle RecursionLevel
Сидоров Директор 2

На четвёртом уровне — пустой набор, т.к. у Сидорова нет начальника.
После чего все наборы данных объединяются и выдаются как результат рекурсивного CTE:
LastName JobTitle RecursionLevel
Иванов Программист 0
Петров Начальник отдела 1
Сидоров Директор 2
21 фев 13, 13:41    [13960737]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Гость333
4) Все наборы данных, полученные на каждом уровне рекурсии, объединяются в итоговый набор.
Но на каждом шаге рекурсии (внутри CTE) доступен только датасет, полученный на предыдущем шаге.
Все датасеты объединяются после выполнения всей рекурсии.
21 фев 13, 14:39    [13961265]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
MaxNevermind
Member

Откуда: Москва
Сообщений: 206
Всем ответившим спасибо.
Остался один вопрос, но чисто риторический, зачем надо было описывать синтаксис рекурсивного запроса таким образом, что его не поймешь даже со знанием принципа работы рекурсий в других языках программирования и синтаксиса других команд самого SQL, используемых для описание рекурсивного запроса.
21 фев 13, 14:43    [13961296]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
MaxNevermind
Всем ответившим спасибо.
Остался один вопрос, но чисто риторический, зачем надо было описывать синтаксис рекурсивного запроса таким образом, что его не поймешь даже со знанием принципа работы рекурсий в других языках программирования и синтаксиса других команд самого SQL, используемых для описание рекурсивного запроса.
Чтобы как можно меньше людей поняли синтаксис и смогли стать востребованными специалистами. Таким образом те, кто все таки разобрался, стали бы требовать бОльшую зарплату.
21 фев 13, 21:48    [13963712]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
mccc
Member [заблокирован]

Откуда: Казань
Сообщений: 7650
Mind
MaxNevermind
Всем ответившим спасибо.
Остался один вопрос, но чисто риторический, зачем надо было описывать синтаксис рекурсивного запроса таким образом, что его не поймешь даже со знанием принципа работы рекурсий в других языках программирования и синтаксиса других команд самого SQL, используемых для описание рекурсивного запроса.
Чтобы как можно меньше людей поняли синтаксис и смогли стать востребованными специалистами. Таким образом те, кто все таки разобрался, стали бы требовать бОльшую зарплату.

просто и яр. стали бы требовать бОльшую зарплату
к (!red), это свойство молодежи. новых.
21 фев 13, 22:17    [13963793]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Вот оптимизированый вариант, данные всех родителей уже сидят в hierarchyid.
И вроде как чуть проще в поннимании...
declare @EmployeeToGetOrgFor int = 181;
with    cte ( NodeId )
          as ( select   OrganizationNode
               from     HumanResources.Employee
               where    BusinessEntityID = @EmployeeToGetOrgFor
               
               union all

               select   NewNodeId
               from     cte
                        cross apply ( select NodeId.GetAncestor(1) as NewNodeId ) t
               where    NewNodeId != 0x
             )
    select  e.BusinessEntityID
          , e.OrganizationNode
          , FirstName
          , LastName
          , e.JobTitle
    from    HumanResources.Employee e
            join Person.Person p on p.BusinessEntityID = e.BusinessEntityID
            join cte on NodeId = e.OrganizationNode
option  ( maxrecursion 0 );


А вообще вот самая простая рекурсия, с этого можно начать.
;with    cte ( id )
          as ( select   1
               union all
               select   id + 1
               from     cte
               where    id < 10000
             )
    select  id
    from    cte
option  ( maxrecursion 0 )
21 фев 13, 23:30    [13964011]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
не правильно было в предыдущем сообщении...
чтоб результат был идентичный вот так нужно
declare @EmployeeToGetOrgFor int = 181;
with    cte ( NodeId )
          as ( select   OrganizationNode.GetAncestor(1)
               from     HumanResources.Employee
               where    BusinessEntityID = @EmployeeToGetOrgFor
               
               union all

               select   NewNodeId
               from     cte
                        cross apply ( select    NodeId.GetAncestor(1) as NewNodeId ) t
               where    NodeId != 0x
             )
    select  e.BusinessEntityID
          , e.OrganizationNode
          , FirstName
          , LastName
          , e.JobTitle
    from    HumanResources.Employee e
            join Person.Person p on p.BusinessEntityID = e.BusinessEntityID
            join cte on NodeId = e.OrganizationNode
option  ( maxrecursion 0 );
21 фев 13, 23:44    [13964052]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Владимир Затуливетер,

о, а за MAXRECURSION 0 - спасибо:) не заметил в описании
21 фев 13, 23:46    [13964060]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8757
Cygapb-007
Владимир Затуливетер,

о, а за MAXRECURSION 0 - спасибо:) не заметил в описании

Агамс.... "Как убить подвесить серовер"... Внутри функций, кажется, не работает...

вот так работает:

with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select * from tbl
 option (maxrecursion 10)


а вот так - ниххерра :
create function f_test (@rec integer = 10) returns table

return
(
with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select * from tbl
option (maxrecursion 10) /* но если эту строку закоментить, то всё будет зайэпись */

)
 go

select * from  f_test(null)
22 фев 13, 04:33    [13964491]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8757
ну и в конце забыл в примеро добавить

drop function f_test;
go


(нех мусор плодить)

-------------------------

Пробовал последний раз на: Microsoft SQL Server 2012 - 11.0.2218.0 (X64)
Jun 12 2012 13:05:25
Copyright (c) Microsoft Corporation
Enterprise Evaluation Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
22 фев 13, 04:37    [13964492]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
SIMPLicity_
Cygapb-007
Владимир Затуливетер,

о, а за MAXRECURSION 0 - спасибо:) не заметил в описании

Агамс.... "Как убить подвесить серовер"... Внутри функций, кажется, не работает...

вот так работает:

with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select * from tbl
 option (maxrecursion 10)


а вот так - ниххерра :
create function f_test (@rec integer = 10) returns table

return
(
with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select * from tbl
option (maxrecursion 10) /* но если эту строку закоментить, то всё будет зайэпись */

)
 go

select * from  f_test(null)
option относится ко всему внешнему запросу.
Пишите внутри функции без option, а option ставьте для SELECTа из функции.
В том числе и option(maxrecursion 10)
22 фев 13, 09:17    [13964862]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
MaxNevermind
Member

Откуда: Москва
Сообщений: 206
Кто-нибудь может привести пример рекурсивного запроса который:
1) Нельзя написать проще не используя рекурсивного запроса
2) Нельзя написать оптимальнее(по времени выполнения запроса) не используя рекурсивного запроса

Просто, к вопросу о смысле их существования. Вот например пример из той же книги:
WHILE @CustomerID < 100
BEGIN
	SELECT @startDate = 'Jan 01, 2007',
	@endDate = DATEADD(yy, 1, @startDate);
	WITH dates AS
		(SELECT @startDate AS begindate
		UNION ALL
		SELECT DATEADD(dd,1,begindate) FROM dates
			WHERE begindate < dateadd(dd,-1,@endDate ) )
	INSERT INTO #orderdates
	SELECT @CustomerID, begindate FROM dates
	OPTION (MAXRECURSION 0);
	SET @CustomerID = @CustomerID + 1
END


Какой смысл так писать, можно обойтись обычным циклом, от этого по-моему только читабельность падает.
22 фев 13, 11:28    [13965652]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MaxNevermind
Кто-нибудь может привести пример рекурсивного запроса который:
1) Нельзя написать проще не используя рекурсивного запроса

Любая рекурсия эмулируется циклом.

MaxNevermind
Какой смысл так писать, можно обойтись обычным циклом,

Только цикла будет два.
Примеры из литерартуры нужны, чтобы показать как работает тот или иной функционал
Это не реальные системы и задачи.
22 фев 13, 11:37    [13965720]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
MaxNevermind, Вам руки чтоль крутят, аль паяльником пытают... не хотите так делать... не видите достойного применения... ну так и не используйте...
P.S.: В скль "читабельность" не самый приоритетный фактор...
22 фев 13, 11:39    [13965734]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
buser
MaxNevermind, Вам руки чтоль крутят, аль паяльником пытают... не хотите так делать... не видите достойного применения... ну так и не используйте...
P.S.: В скль "читабельность" не самый приоритетный фактор...


Да не приоритетный, но тоже важный. (Жуть как не люблю не отформатированные запросы).
Это я не в поддержку циклов если что :-)
Это в поддержку форформатирования.
22 фев 13, 11:49    [13965798]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3282
MaxNevermind
Вот например пример из той же книги
Идиотский пример, но видимо автору не пришло в голову ничего более правдоподобного.

Реальная ситуация, когда рекурсия спасает - обход дерева.

Кроме того, оптимальность - это не только быстрое выполнение, это еще и количество используемых ресурсов. Процессор, память, диски, налагаемые блокировки - тут все важно.
22 фев 13, 11:50    [13965812]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8757
iap
+
SIMPLicity_
пропущено...

Агамс.... "Как убить подвесить серовер"... Внутри функций, кажется, не работает...

вот так работает:

with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select * from tbl
 option (maxrecursion 10)


а вот так - ниххерра :
create function f_test (@rec integer = 10) returns table

return
(
with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select * from tbl
option (maxrecursion 10) /* но если эту строку закоментить, то всё будет зайэпись */

)
 go

select * from  f_test(null)
option относится ко всему внешнему запросу.
Пишите внутри функции без option, а option ставьте для SELECTа из функции.
В том числе и option(maxrecursion 10)


iap, я не о "select top 10 ... " писал...

... или Вы что-то другое имели в виду? Если таки да, то код нарисуйте.
Ну и это,- "заранее спасибо".
22 фев 13, 13:59    [13966864]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
SIMPLicity_
iap
+
пропущено...
option относится ко всему внешнему запросу.
Пишите внутри функции без option, а option ставьте для SELECTа из функции.
В том числе и option(maxrecursion 10)


iap, я не о "select top 10 ... " писал...

... или Вы что-то другое имели в виду? Если таки да, то код нарисуйте.
Ну и это,- "заранее спасибо".


create function f_test (@rec integer = 10) returns table

return
(
with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select * from tbl

)
 go

select * from  f_test(null)
option (maxrecursion 10) /* но если эту строку закоментить, то всё будет зайэпись */
22 фев 13, 14:03    [13966899]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8757
Ух ты!!!
Спасибо!...
Только подглядеть "как оно работает" не удалось:

drop function f_test ;
go

create function f_test (@rec integer = 10) returns table

return
(
with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select top 99 percent * from tbl 
order by id desc
)
 go

select * from  f_test(null) 

option (maxrecursion 10)


возвращает пустую таблицу...
22 фев 13, 14:18    [13966971]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
SIMPLicity_,

потому что в рекурсии получилось больше, чем 10 уровней (20).
А если достигается разрешённый максимум (maxrecursion), то возвращается сообщение об этом и - облом.
То есть, option - это не для ограничения результирующего датасета, а для контроля заданных условий выполнения запроса.
22 фев 13, 14:25    [13967028]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8757
iap
SIMPLicity_,

потому что в рекурсии получилось больше, чем 10 уровней (20).
А если достигается разрешённый максимум (maxrecursion), то возвращается сообщение об этом и - облом.
То есть, option - это не для ограничения результирующего датасета, а для контроля заданных условий выполнения запроса.


Т.е. maxrecursin как бы нахлобучивается сверху на f_test и её выполнение происходит уже в рамках "нахлобученного" значения maxrecursion... Выходит так, да?

PS В запросе (без функции) кроме сообщения о достигнутом уровне таки выводится таблица...
PPS В принципе, это уже "академический" интерес так как я каким-то образом решил поставленные задачи... Ну, всё равно, спасибо,- буду знать... :)
22 фев 13, 18:12    [13968479]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить