Создание al oop для предложения имени пользователя + номер - SQL Server - PullRequest
0 голосов
/ 12 апреля 2020

Я пытался создать процедуру для реализации при создании пользователя. Процедура предназначена для того, чтобы увидеть, занято ли уже имя пользователя, и в этом случае оно должно напечатать альтернативное имя пользователя. Альтернатива должна быть построена из имени пользователя + наименьшее число, которое еще не занято.

Например, если я попробовал «Офек» и оба «Офек» и «Офек1» были взяты, я должен получить «Офек2».

Пока это то, что у меня есть:

ALTER PROCEDURE [dbo].[SuggestUsername]
    @username varchar(10)
AS
BEGIN
    DECLARE @name varchar(10)

    IF @username IN (SELECT User_Name FROM Players WHERE User_Name = @username)
        WHILE (@name IN (SELECT User_Name FROM Players WHERE User_Name = @username))
            SET @name = (CONCAT(@username, +1))
            PRINT (CONCAT('Username already taken. Please choose a different one, or use: ', @name))
END

По какой-то причине @name выглядит пустым, когда я пытаюсь его запустить. Есть ли лучший способ сделать это? если нет, что не так с моим текущим кодом?

Заранее спасибо!

edit Я решил отказаться от этой идеи и попытаться реализовать ее по-другому (с подсчет того, сколько раз @username уже появляется как дополнительный номер). Спасибо всем, кто пытался помочь.

1 Ответ

1 голос
/ 12 апреля 2020

Поскольку вы упоминаете, что это просто "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() для уведомления пользователя, если имя уже занято без предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...