Функция может быть создана следующим образом:
CREATE FUNCTION [dbo].[FunctionName] (@UserName VARCHAR(50))
RETURNS VARCHAR(50)
AS
BEGIN
RETURN COALESCE(
( SELECT [User_name]
FROM people AS p WITH(NOLOCK)
WHERE p.status_id = 1
AND p.last_login > DATEADD(MONTH, -12, GETDATE())
AND p.[user_name] NOT LIKE '%2'
AND [User_name] = @UserName
), 'StandardUser')
END
Я попытался максимально упростить ваш выбор, исходя из предположения, что имя_пользователя уникально, т. Е. Имя_пользователя не может иметь статус-идентификатора 1 и 2, что позволило мне удалить NOT IN
из оператора, так как сначала вы выбираете группу пользователей, где status_ID равен 1, а затем удаляете из них, где status_ID равен 1 или 2, а имя пользователя заканчивается на 2. Поскольку в первой группе не будет никого, у кого статус status_ID не равен 1 затем вы можете просто удалить тех из первой группы, чье имя пользователя заканчивается на 2, для которого не требуется подзапрос, только предложение where.
Сказав все это, я все равно был бы склонен использовать представление или аналогичное решение на основе множеств для достижения того же результата. Что-то вроде:
SELECT *, COALESCE(a.[User_Name], 'StandardUser') [NewUserName]
FROM People p
LEFT JOIN
( SELECT [User_name]
FROM people AS p WITH(NOLOCK)
WHERE p.status_id = 1
AND p.last_login > DATEADD(MONTH, -12, GETDATE())
AND p.[user_name] NOT LIKE '%2'
) a
ON p.[User_name] = a.[User_name]