#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