---- BelongsToObjEx ----
-- расширенная процедура проверки принадлежности объекта, использует break-тип_объекта, для принудительного выхода из цикла поиска
-- полезно например в таких иерархиях, как Подстанция->Линия->Подстанция->Линия и мы не хотим выходить да пределы уровня
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[BelongsToObjEx]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[BelongsToObjEx]
GO
create function BelongsToObjEx(@ChildID integer, @ParentID integer, @BreakObjectTypeID integer)
returns bit
as
begin
  if @ChildID is NULL or @ChildID = 0 or @ParentID is null or @ParentID = 0 return 0
  declare @res bit
  declare @CurParentID int
  declare @CurChildID int
  declare @CurParentTypeID int
  select @CurParentID = IsNull(Объект.Код_объекта_владельца,0), 
    @CurParentTypeID = IsNull(Владелец.Код_типа_объекта,0) 
    from Объект 
    left join Объект Владелец on Владелец.Код_объекта_владельца = Объект.Код_объекта
    where Объект.Код_объекта = @ChildID

  while (@CurParentID<>0) AND (@CurParentID<>@ParentID) AND (@CurParentTypeID <> @BreakObjectTypeID)
  begin
    set @CurChildID = @CurParentID
    select @CurParentID = IsNull(Объект.Код_объекта_владельца,0),
      @CurParentTypeID = IsNull(Владелец.Код_типа_объекта,0) 
      from Объект 
      left join Объект Владелец on Владелец.Код_объекта_владельца = Объект.Код_объекта
      where Объект.Код_объекта = @CurChildID
  end
  if @CurParentID = @ParentID set @res = 1 else set @res = 0
  return @res
end
