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

Откуда:
Сообщений: 56
Здравствуйте.
USE [шшшш]
GO
/****** Object:  UserDefinedFunction [dbo].[Rootdepart]    Script Date: 12.09.2016 10:43:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Возвращает дерево департамент.
create function [dbo].[Rootdepart](@o_id int =0 ) RETURNs @rett table (kid int primary key, pid int , br varchar(500))  as

begin

with tree (kid, pid, br)
as (Select EOT_1.DepartmentID kid, IsNull(EOT_2.DepartmentID, null) pid, (
    Select
      DepartBrief DepartBrief
    From
      DepartmentMove EOT_5
    Where
      (EOT_5.DepartmentID = EOT_1.DepartmentID) and (EOT_5.MoveDate = (
        Select
          Max(EOT_6.MoveDate)
          Column1
        From
          DepartmentMove EOT_6
        Where
          (EOT_6.DepartmentID = EOT_1.DepartmentID) and (EOT_6.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112)) and (EOT_6.isProject = 0)
      )) and (EOT_5.isProject = 0)
  ) br
From
  Department EOT_1
  Left Outer Join Department EOT_2
    On (EOT_2.DepartmentID = (
      Select
        EOT_3.ParentID ПодразделениеРодитель
      From
        DepartmentMove EOT_3
      Where
        (EOT_3.DepartmentID = EOT_1.DepartmentID) and (EOT_3.MoveDate = (
          Select
            Max(EOT_4.MoveDate)
            Column1
          From
            DepartmentMove EOT_4
          Where
            (EOT_4.DepartmentID = EOT_1.DepartmentID) and (EOT_4.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112))
        )) and (EOT_3.isProject = 0)
    ))
 where eot_2.DepartmentID is null and eot_1.DepartmentID=@o_id
union all
   Select EOT_1.DepartmentID kid, IsNull(EOT_2.DepartmentID, null) pid, (
    Select
      DepartBrief DepartBrief
    From
      DepartmentMove EOT_5
    Where
      (EOT_5.DepartmentID = EOT_1.DepartmentID) and (EOT_5.MoveDate = (
        Select
          Max(EOT_6.MoveDate)
          Column1
        From
          DepartmentMove EOT_6
        Where
          (EOT_6.DepartmentID = EOT_1.DepartmentID) and (EOT_6.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112)) and (EOT_6.isProject = 0)
      )) and (EOT_5.isProject = 0)
  ) br
From
  Department EOT_1
  Left Outer Join Department EOT_2
    On (EOT_2.DepartmentID = (
      Select
        EOT_3.ParentID ПодразделениеРодитель
      From
        DepartmentMove EOT_3
      Where
        (EOT_3.DepartmentID = EOT_1.DepartmentID) and (EOT_3.MoveDate = (
          Select
            Max(EOT_4.MoveDate)
            Column1
          From
            DepartmentMove EOT_4
          Where
            (EOT_4.DepartmentID = EOT_1.DepartmentID) and (EOT_4.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112))
        )) and (EOT_3.isProject = 0)
    )) inner join tree on tree.kid = EOT_1.departmentid) 
insert @rett 
select kid,pid,br 
from tree
--option (maxrecursion 10)
--delete from @t

return  

end
go

ошибка
Msg 467, Level 16, State 1, Procedure Rootdepart, Line 14
Функции GROUP BY, HAVING и агрегатные функции не разрешены в рекурсивной части рекурсивного обобщенного табличного выражения "tree".
Msg 462, Level 16, State 1, Procedure Rootdepart, Line 14
Внешнее соединение не разрешено в рекурсивной части рекурсивного обобщенного табличного выражения "tree".
Msg 208, Level 16, State 1, Line 98
Подскажите пожалуйста, что не так?
12 сен 16, 18:45    [19655899]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Nikita Gavrilov,

Max(EOT_4.MoveDate) -- недопустим в рекурсивном запросе.
12 сен 16, 19:30    [19656090]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
create function [dbo].[Rootdepart](@o_id int =0 ) RETURNs @rett table (kid int primary key, pid int , br varchar(500))  as

begin

declare @t table (kid int primary key, pid int , br varchar(500)) 
insert into @t 
Select EOT_1.DepartmentID kid, IsNull(EOT_2.DepartmentID, null) pid, (
    Select
      DepartBrief DepartBrief
    From
      DepartmentMove EOT_5
    Where
      (EOT_5.DepartmentID = EOT_1.DepartmentID) and (EOT_5.MoveDate = (
        Select
          Max(EOT_6.MoveDate)
          Column1
        From
          DepartmentMove EOT_6
        Where
          (EOT_6.DepartmentID = EOT_1.DepartmentID) and (EOT_6.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112)) and (EOT_6.isProject = 0)
      )) and (EOT_5.isProject = 0)
  ) br
From
  Department EOT_1
  Left Outer Join Department EOT_2
    On (EOT_2.DepartmentID = (
      Select
        EOT_3.ParentID ПодразделениеРодитель
      From
        DepartmentMove EOT_3
      Where
        (EOT_3.DepartmentID = EOT_1.DepartmentID) and (EOT_3.MoveDate = (
          Select
            Max(EOT_4.MoveDate)
            Column1
          From
            DepartmentMove EOT_4
          Where
            (EOT_4.DepartmentID = EOT_1.DepartmentID) and (EOT_4.MoveDate <= Convert(DateTime, '20160912 00:00:00', 112))
        )) and (EOT_3.isProject = 0)
    ))
; with tree (kid, pid, br, br1)
as (select kid, pid, br, cast(kid as varchar(500)) br1
   from @t
 where pid is null and kid=@o_id
union all
   select t.kid, t.pid, t.br, cast(cast(tree.br1  as varchar(500)) +','+cast(t.kid as varchar(500)) as varchar(500))
   from @t t inner join tree on tree.kid = t.pid) 
select * 
from tree
option (maxrecursion 10)
delete from @t

return  

end

дает ошибку
Msg 444, Level 16, State 2, Procedure Rootdepart, Line 51
Инструкции SELECT, входящие в функцию, не могут возвратить данные клиенту.
Подскажите пожалуйста, что не так?
13 сен 16, 11:57    [19658436]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Nikita Gavrilov
delete from @t

а це за для нафига то ?
13 сен 16, 12:04    [19658509]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
Maxx,
Чтоб удалить временную таблицу (убрал ошибка все равно осталась)
13 сен 16, 12:35    [19658757]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Nikita Gavrilov,

select * 
from tree
option (maxrecursion 10)


Это выкиньте
13 сен 16, 12:50    [19658849]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
return  

чего возвращать??
если не ошибаюсь, должно быть типа
RETURN (;WITH cc .... SELECT * FROM ccc)



Ken@t
Nikita Gavrilov,

select * 
from tree
option (maxrecursion 10)


Это выкиньте

:)
13 сен 16, 13:05    [19658939]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
TaPaK,
Что то куда бы не вставил этот return везде дает ошибку
;with tree (kid, pid, br, br1)
as (select kid, pid, br, cast(kid as varchar(500)) br1
   from @t
 where pid is null and kid=@o_id
union all
   select t.kid, t.pid, t.br, cast(cast(tree.br1  as varchar(500)) +','+cast(t.kid as varchar(500)) as varchar(500))
   from @t t inner join tree on tree.kid = t.pid)
--   select kid from tree
--return kid--(select kid from tree);
--option (maxrecursion 10)
 return;
--delete @t
end

ошибка
Msg 156, Level 15, State 1, Procedure Rootdepart, Line 62
Неправильный синтаксис около ключевого слова "return".
Msg 1075, Level 15, State 1, Procedure Rootdepart, Line 62
Инструкции RETURN в скалярных функциях должны содержать аргумент.

return;with tree (kid, pid, br, br1) as select....

ошибка
Msg 1075, Level 15, State 1, Procedure Rootdepart, Line 51
Инструкции RETURN в скалярных функциях должны содержать аргумент.
Msg 156, Level 15, State 1, Procedure Rootdepart, Line 67
Неправильный синтаксис около ключевого слова "end".

;with tree (kid, pid, br, br1)
as (select kid, pid, br, cast(kid as varchar(500)) br1
   from @t
 where pid is null and kid=@o_id
union all
   select t.kid, t.pid, t.br, cast(cast(tree.br1  as varchar(500)) +','+cast(t.kid as varchar(500)) as varchar(500))
   from @t t inner join tree on tree.kid = t.pid)
  select kid from tree
--return kid--(select kid from tree);
--option (maxrecursion 10)
return(kid);
--delete @t
end

ошибка
Msg 444, Level 16, State 2, Procedure Rootdepart, Line 51
Инструкции SELECT, входящие в функцию, не могут возвратить данные клиенту.
Msg 207, Level 16, State 1, Procedure Rootdepart, Line 61
Недопустимое имя столбца "kid".
13 сен 16, 13:57    [19659256]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Nikita Gavrilov,

жесть... либо крестик либо трусы

если пишете
RETURNs @rett table (kid int primary key, pid int , br varchar(500)
то и вставляйте в эту таблицу и тогда просто RETURN

если
RETUTN TABLE
то
RETURN (;WITH ... SELECT ... )
13 сен 16, 14:00    [19659278]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
TaPaK,
;with @tree (kid, pid, br, br1)
as (select kid, pid, br, cast(kid as varchar(500)) br1
   from @t
 where pid is null and kid=@o_id
union all
   select t.kid, t.pid, t.br, cast(cast(tree.br1  as varchar(500)) +','+cast(t.kid as varchar(500)) as varchar(500))
   from @t t inner join @tree on @tree.kid = t.pid)
   --select kid from @tree
--return kid--(select kid from tree);
--option (maxrecursion 10)
 return;
--delete @t
end

Msg 102, Level 15, State 1, Procedure Rootdepart, Line 51
Неправильный синтаксис около конструкции "@tree".
13 сен 16, 14:08    [19659314]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Nikita Gavrilov
TaPaK,
;with @tree (kid, pid, br, br1)
as (select kid, pid, br, cast(kid as varchar(500)) br1
   from @t
 where pid is null and kid=@o_id
union all
   select t.kid, t.pid, t.br, cast(cast(tree.br1  as varchar(500)) +','+cast(t.kid as varchar(500)) as varchar(500))
   from @t t inner join @tree on @tree.kid = t.pid)
   --select kid from @tree
--return kid--(select kid from tree);
--option (maxrecursion 10)
 return;
--delete @t
end

Msg 102, Level 15, State 1, Procedure Rootdepart, Line 51
Неправильный синтаксис около конструкции "@tree".

with tree_cte
.... INSERT INTO @Tree FROM tree_cte
13 сен 16, 14:09    [19659318]     Ответить | Цитировать Сообщить модератору
 Re: Помогите засунуть в функцию или процедуру запрос.  [new]
Nikita Gavrilov
Member

Откуда:
Сообщений: 56
TaPaK,
БОЛЬШОЕ СПАСИБО!!!!!!
13 сен 16, 14:19    [19659381]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить