Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建循环以建议用户名+号码-SQL Server_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

创建循环以建议用户名+号码-SQL Server

创建循环以建议用户名+号码-SQL Server,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我一直在尝试创建一个在用户创建中实现的过程。该过程旨在查看用户名是否已被使用,在这种情况下,它必须打印一个替代用户名。需要根据用户名+尚未使用的最低数字来构造备用项 例如,如果我尝试了Ofek,并且同时使用了Ofek和Ofek1,我应该会收到Ofek2 到目前为止,这就是我所拥有的: ALTER PROCEDURE [dbo].[SuggestUsername] @username varchar(10) AS BEGIN DECLARE @name varchar(10)

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

例如,如果我尝试了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作为附加数字出现的次数。感谢所有试图帮助我的人。

既然你提到这只是为了你们学校的一门课,而且我因为新冠病毒而有时间花,下面是一个窍门

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;
你可以看到它是如何工作的


我不建议将此作为真正的解决方案或在真正的数据库上使用的方法,相反,您可以添加一个唯一的约束或使用EXISTS来通知用户是否已经使用了该名称,而无需建议

如果建议的名称以数字结尾怎么办?如果传入的用户名已经是10个字符,因此没有空间附加数字怎么办?TBH 10个字符作为用户名的最大长度似乎非常短。也许它应该支持nvarchar字符,允许名字中有非拉丁字符的人使用自己的名字1。它应该总是以数字结尾。为什么这会是个问题?2.这只是一个用于测试目的的样本。我最终会增加长度。declare@name varchar10默认为null,希望在User\u name=@username的玩家的select User\u name中永远找不到。您仍然没有满意地回答Gordon的问题。如果有人试图注册Ofek1992,并且已经注册了,那么应该建议注册Ofek1993还是Ofek19921?