sql - 创建一个循环来建议用户名+号码 - 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 已经作为附加数字出现的次数)。感谢所有试图提供帮助的人。
解决方案
既然你提到这只是"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()
来通知用户,如果该名称已被采用而没有建议。
推荐阅读
- javascript - “npm ERR!JSON 输入意外结束附近”,同时创建一个新的反应应用程序
- eclipse - 通过 tcl 脚本设置 Eclipse IDE
- python - 在 apache 网络服务器中执行 python cgi 脚本的问题
- javascript - React 中的材料表。使用状态变量动态设置表格选项
- asp.net - 如何创建适用于经典 ASP 和 VB.NET 页面的检查 cookie VB 服务器端脚本?
- ranking - 在 ELO 系统中创建自己的排名等级的最佳方法是什么
- javascript - 显示数字表是否正确?
- mysql - 计算总和、平均值、最大值和最小值
- c - 如何打印最大值和最小值的索引?
- python - 如何定义给定测试子目录中的所有测试都使用的 pytest 夹具?