首页 > 解决方案 > 创建一个循环来建议用户名+号码 - SQL Server

问题描述

我一直在尝试创建一个在用户创建中实现的过程。该过程旨在查看用户名是否已被使用,在这种情况下,它必须打印替代用户名。替代需要从用户名+尚未使用的最小数字构建。

例如,如果我尝试“Ofek”并且“Ofek”和“Ofek1”都被占用,我应该收到“Ofek2”。

到目前为止,这就是我所拥有的:

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每当我尝试运行它时,它都会显示为空。有更好的方法吗?如果没有,我当前的代码有什么问题?

提前致谢!

编辑 我决定放弃这个想法并尝试以不同的方式实现它(计算@username 已经作为附加数字出现的次数)。感谢所有试图提供帮助的人。

标签: sqlsql-servertsqlstored-procedures

解决方案


既然你提到这只是"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()来通知用户,如果该名称已被采用而没有建议。


推荐阅读