Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите дописать функцию  [new]
VIT2708_
Guest
Мне нужно получить пользователя у которого наименьшее количество документов и что бы он был в логине

количество документов беру из dbo.Data
пользователей кто в логине dbo.Users

Хочу написать функцию

CREATE FUNCTION dbo.GetUsersD(@catalog bigint) return bigint
as
begin
	declare @uId bigint

	set @uId = (
select top(1) userId from (
select d.userId as userId, count(d.userId) as cnt 
		from dbo.Data d 
		left join dbo.Users u on d.userId=u.userid
			where u.LogIn='True' and d.ctg=@catalog 
group by d.userId 
order by d.userId asc) 
as A
)

	return @uId
end


А выдает мне вот такую ошибку

Msg 156, Level 15, State 1, Procedure dbo.GetUsersD, Line 2
Incorrect syntax near the keyword 'return'.
Msg 1033, Level 15, State 1, Procedure dbo.GetUsersD, Line 14
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
Msg 178, Level 15, State 1, Procedure dbo.GetUsersD, Line 17
A RETURN statement with a return value cannot be used in this context.



Вижу что ругается на TOP, ORDER BY и return

Помогите исправить, потому что я запутался

PS: мне в ХП нужно из этой функции вернуть ID пользователя.

спасибо.
12 ноя 14, 17:32    [16836116]     Ответить | Цитировать Сообщить модератору
 Re: Помогите дописать функцию  [new]
Glory
Member

Откуда:
Сообщений: 104760
VIT2708_
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.

У вас затруднения с прочтением текста ошибки ?
12 ноя 14, 17:33    [16836124]     Ответить | Цитировать Сообщить модератору
 Re: Помогите дописать функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Что характерно, ошибка в 17-й строке!

На самом деле всё из-за второй, конечно.
Хотя, весь запрос внутри функции какой-то кривенький.
12 ноя 14, 17:42    [16836167]     Ответить | Цитировать Сообщить модератору
 Re: Помогите дописать функцию  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
VIT2708_,

select TOP 99999999 d.userId as userId, count(d.userId) as cnt
12 ноя 14, 18:21    [16836323]     Ответить | Цитировать Сообщить модератору
 Re: Помогите дописать функцию  [new]
o-o
Guest
>>> Incorrect syntax near the keyword 'return' --> returnS
CREATE FUNCTION dbo.GetUsersD(@catalog bigint) returns bigint


a_voronin
VIT2708_,
select TOP 99999999 d.userId as userId, count(d.userId) as cnt

a_voronin, вы под Остера что-ли косите, книгу вредных советов попoлняете?

>>>The ORDER BY clause is invalid...

VIT2708_ , order by к чему у вас относится , к top(1)?
ну а куда вы его впихнули?
не надо еще один top 9999 лепить, надо на место order by вернуть, за нужные скобки.
и почему сортируете по юзеру, если надо вывести имеющего наименьший count?
короче что-то такое

CREATE FUNCTION dbo.GetUsersD(@catalog bigint) returns bigint
as
begin
	declare @uId bigint

	set @uId = (
select top(1) userId from (
select d.userId as userId, count(d.userId) as cnt 
		from dbo.Data d 
		left join dbo.Users u on d.userId=u.userid
			where u.LogIn='True' and d.ctg=@catalog 
group by d.userId 
) 
as A
order by cnt 
)

	return @uId
end
12 ноя 14, 19:11    [16836505]     Ответить | Цитировать Сообщить модератору
 Re: Помогите дописать функцию  [new]
aleks2
Guest
Нафига декларация переменной? Нафига лишнее присваивание?
CREATE FUNCTION dbo.GetUsersD(@catalog bigint) returns bigint
as
begin

return( select top(1) userId 
             from ( select d.userId, count(d.userId) as cnt 
		from dbo.Data d 
		       inner join dbo.Users u on d.userId=u.userid
                         where u.LogIn='True' and d.ctg=@catalog 
                      group by d.userId 
                   ) as A
            order by cnt 
        )

end


По уму, ее, ваще, надо в inline переделать.
12 ноя 14, 19:38    [16836650]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить