  -- проверяет, является ли тип работы типом работы верхнего уровня в дереве типов работ его типа объекта
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[IsTopworkTypeInObjTypeTree]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[IsTopworkTypeInObjTypeTree]
GO
create function IsTopworkTypeInObjTypeTree(@WorkTypeID integer, @ObjTypeID integer)
returns bit
as
begin
  declare @res bit
  if exists(select 1 from Справочник_подработ Спр1 inner join Справочник_видов_работ Спр2 on Спр2.Код_вида_работы = Спр1.Код_вида_работы
      where спр2.код_типа_объекта = @ObjTypeID and Спр1.Код_вида_подработы = @WorkTypeID) set @res = 0
  else
  begin
    set @res = 1
    declare @CurWorkTypeID int
    declare @CurObjTypeID int
    -- пробегаемся по всем типам надработ
    declare Cur cursor for SELECT Код_вида_работы FROM Справочник_подработ WHERE Код_вида_подработы = @WorkTypeID
    open Cur
    fetch next from Cur into @CurWorkTypeID
    while (@@fetch_status = 0) AND (@res = 1)
    begin
      set @res = dbo.IsTopworkTypeInObjTypeTree(@CurWorkTypeID, @ObjTypeID)
      if @res = 1 fetch next from Cur into @CurWorkTypeID
    end
  end
  return @res
end
