Поскольку вы упоминаете, что это просто "for a class"
в вашем комментарии , и у меня есть время, чтобы потратить его из-за COVID, вот фокус.
CREATE VIEW MyView
AS
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) N
FROM (VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0)) T(A) CROSS JOIN
(VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0)) TT(B) CROSS JOIN
(VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0)) TTT(C) CROSS JOIN
(VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0)) TTTT(D);
-- 6561 number
CREATE TABLE Users
(
UserName VARCHAR(10) UNIQUE
);
INSERT Users VALUES
('Ofek'), ('Ofek1');
CREATE PROCEDURE MyProc
@UserName VARCHAR(10)
AS
BEGIN
WITH CTE(N, UN) AS
(
SELECT 0, @UserName
UNION ALL
SELECT N, CONCAT(@UserName, N)
FROM MyView
)
INSERT Users(UserName)
SELECT TOP 1 UN
FROM CTE
WHERE NOT EXISTS(SELECT 1 FROM Users WHERE UserName = UN)
ORDER BY N;
END
EXEC MyProc 'Ofek';
SELECT * FROM Users;
Вы можете увидеть, как он работает на db <> fiddle
Я не буду рекомендовать это как реальное решение или способ работы с реальной базой данных, вместо этого вы можете добавить UNIQUE
ограничение или использование EXISTS()
для уведомления пользователя, если имя уже занято без предложения.