我正在尝试为当前登录数据库的每个人创建一个唯一的用户名。我需要这是 8.8 格式。意思是名字的前 8 个字符以句点分隔,姓氏的前 8 个字符。
实现这一目标的最佳方法是什么?
我正在尝试为当前登录数据库的每个人创建一个唯一的用户名。我需要这是 8.8 格式。意思是名字的前 8 个字符以句点分隔,姓氏的前 8 个字符。
实现这一目标的最佳方法是什么?
在 SQL Server 中,您将执行以下操作:
SELECT LEFT(firstname,8) + '.' + LEFT(surname,8)
FROM tablename
LEFT() 函数将返回指定数量的所有字符,在本例中为 8。如果您真的想过滤掉名称少于 8 个字符的用户,您可以添加一个 WHERE 子句,例如:
WHERE LEN(firstname) >=8
AND LEN(surname) >=8
LEN() 是一个内置函数,它返回表达式的长度。
更新
如果您正在寻找当前登录 SQL 的用户,如您的问题所示:
sql不一定知道谁登录,只知道使用的登录名。如果您的用户通过应用程序进行连接,则很可能是他们正在使用共享连接。如果是这种情况,SQL 将不知道每个连接的用户,只知道您的应用程序已建立连接。
尝试以下操作以查看正在使用哪些登录名:
SELECT *
FROM sys.dm_exec_sessions
或者,如果使用不支持上述内容的旧 SQL 版本:
EXEC sp_who2
尽管您不能直接加入存储过程。
您可以仅将用户名设置为主键(保证唯一的质量)或将列设置为 UNIQUE,然后将表中字符的长度指定为 17(8+1+8)个字符:
CREATE TABLE 用户(用户名 VARCHAR(9), .... UNIQUE (username) )
或者
CREATE TABLE 用户(用户名 VARCHAR(9), .... PRIMARY KEY (username))
另一方面,诸如确保最小长度之类的逻辑行为不适用于数据库,而是适用于使用数据库的应用程序。如果输入太长,数据库会抱怨(也可能发生在应用程序层),如果输入太小,应用程序可以填写剩余部分。
这听起来像你要求的:
SELECT
LEFT(lastname+ 'XXXXXXXX', 8) + '.' + LEFT(firstname+ 'XXXXXXXX', 8) AS userid
FROM users
添加 Xs 填充短于 8 个字符的名称。
如果您还希望它们是唯一的,您可以查看每个结果的 ROW_NUMBER() 函数。这变得非常冗长:
SELECT
CASE WHEN ROW_NUMBER() OVER (PARTITION BY LEFT(surname + 'XXXXXXXX', 8) + '.' + LEFT(givenName + 'XXXXXXXX', 8)
ORDER BY LEFT(surname + 'XXXXXXXX', 8) + '.' + LEFT(givenName + 'XXXXXXXX', 8)) = 1
THEN
LEFT(surname + 'XXXXXXXX', 8) + '.' + LEFT(givenName + 'XXXXXXXX', 8)
ELSE
LEFT(surname + 'XXXXXXXX', 8) + '.'
+ LEFT(givenName + 'XXXXXXX', 7)
+ CAST(ROW_NUMBER() OVER (PARTITION BY LEFT(surname + 'XXXXXXXX', 8) + '.' + LEFT(givenName + 'XXXXXXXX', 8)
ORDER BY LEFT(surname + 'XXXXXXXX', 8) + '.' + LEFT(givenName + 'XXXXXXXX', 8))
AS nvarchar(1))
END
FROM tblNames
ROW_NUMBER() 计算返回值的次数,CASE 语句在简单地返回 8.8 或返回 8.7 加上行号之间切换。如果您有超过 10 个受骗者(或者如果任何人的名字中有数字!),您可能需要一些进一步的逻辑,但我希望您明白这一点。