Как мне использовать rowcount в функции в sqlserver?

#sql #sql-server #sql-server-2000

#sql #sql-сервер #sql-server-2000

Вопрос:

Я столкнулся с проблемой использования 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. Вы имеете в виду @@ROWCOUNT?

2. Не связано с вашим вопросом, но вы должны решить использовать верхний или нижний регистр для зарезервированных слов. Любой из них приятен для чтения, но их смешивание придает неаккуратный вид.

3. Почему вы хотите сделать это в функции SET ROWCOUNT @Counter ? Как вы думаете, какой эффект вы хотите, чтобы это имело?

4. @MikaelEriksson: На самом деле мне нужно значение последних строк, в строке которого нет. не исправлено.

5. В @result вы выбираете EMP_ID, тогда для чего используется @COunt?

Ответ №1:

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

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

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

Что-то вроде этого.

 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