Как я могу использовать rowcount в функции в sqlserver? - PullRequest
0 голосов
/ 17 октября 2011

Я столкнулся с проблемой использования rowcount в функции в sql server 2000. Он показывает ошибку вроде Invalid use of 'UNKNOWN TOKEN' within a function.

Моя функция похожа на эту.

ALTER Function fnc_GetOpenShiftWorkID (@EMP_ID int,@Counter int,@date Datetime) returns int as
BEGIN

  SET ROWCOUNT @Counter
  declare @result int

  if exists(select * from tbl_org_workinghrs WHERE EMP_ID=@EMP_ID and SDATE=@DATE)  
  BEGIN

    select  @result= WORK_ID 
    from    tbl_org_working_hrs work_hrs
            inner join tbl_org_shift_group sgroup on sgroup.WH_ID=work_hrs.WORK_ID
            inner join tbl_org_workinghrs workhrs on workhrs.GROUP_ID=sgroup.GROUP_ID
    WHERE   EMP_ID=@EMP_ID 
            and SDATE=@DATE 
    order by 
            IN_START
  END
  ELSE
  BEGIN
    if exists(select * from tbl_org_workinghrs where EMP_ID=0)
    BEGIN
      select  @result=WORK_ID 
      from    tbl_org_working_hrs 
      WHERE   IS_DEFAULTSHIFT=1
    END
  END

  return @result
END

1 Ответ

1 голос
/ 17 октября 2011

Вы хотите получить значение n-й строки, упорядоченное по IN_START.

. В SQL Server 2005 позже вы можете использовать top(n) или row_number().

In.В SQL Server 2000 вы можете использовать табличную переменную с полем идентификатора в качестве временного хранилища.

Примерно так.

declare @T table
(
  ID int identity, 
  WORK_ID int
)

insert into @T (WORK_ID)
select WORK_ID
from tbl_org_working_hrs work_hrs
  inner join tbl_org_shift_group sgroup 
    on sgroup.WH_ID=work_hrs.WORK_ID
  inner join tbl_org_workinghrs workhrs 
    on workhrs.GROUP_ID=sgroup.GROUP_ID
where EMP_ID=@EMP_ID and 
      SDATE=@DATE 
order by IN_START

select @result = WORK_ID
from @T
where ID = @Counter
...