-2

我正在尝试为当前登录数据库的每个人创建一个唯一的用户名。我需要这是 8.8 格式。意思是名字的前 8 个字符以句点分隔,姓氏的前 8 个字符。

实现这一目标的最佳方法是什么?

4

3 回答 3

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

尽管您不能直接加入存储过程。

于 2013-06-11T16:20:59.877 回答
0

您可以仅将用户名设置为主键(保证唯一的质量)或将列设置为 UNIQUE,然后将表中字符的长度指定为 17(8+1+8)个字符:

CREATE TABLE 用户(用户名 VARCHAR(9), .... UNIQUE (username) )

或者

CREATE TABLE 用户(用户名 VARCHAR(9), .... PRIMARY KEY (username))

另一方面,诸如确保最小长度之类的逻辑行为不适用于数据库,而是适用于使用数据库的应用程序。如果输入太长,数据库会抱怨(也可能发生在应用程序层),如果输入太小,应用程序可以填写剩余部分。

于 2013-06-11T15:53:45.590 回答
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 个受骗者(或者如果任何人的名字中有数字!),您可能需要一些进一步的逻辑,但我希望您明白这一点。

于 2013-06-11T16:27:44.847 回答