我正在尝试为当前登录数据库的每个人创建一个唯一的用户名。我需要这是一个8.8格式。这意味着名字的前8个字符用句点分隔,8个名字的第一个字符。
实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
在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
虽然您无法直接加入存储过程。
答案 1 :(得分:0)
您只需将用户名设置为主键(保证唯一质量)或将列设置为UNIQUE,然后将表中的字符长度指定为17(8 + 1 + 8)个字符:< / p>
CREATE TABLE用户(用户名VARCHAR(9),.... UNIQUE(用户名))
或
CREATE TABLE用户(用户名VARCHAR(9),.... PRIMARY KEY(用户名))
另一方面,确保最小长度的逻辑行为不适合数据库,而是适用于使用数据库的应用程序。如果输入很长,数据库会抱怨(也可能在应用程序层发生),如果输入很小,应用程序可以填写剩余数据。
答案 2 :(得分:0)
这听起来像你要求的那样:
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个骗局(或者如果有人的名字中有数字!)你可能想要一些进一步的逻辑,但我希望你明白这一点。