返回名称的前8个字符

时间:2013-06-11 15:41:14

标签: sql sql-server select

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

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

3 个答案:

答案 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个骗局(或者如果有人的名字中有数字!)你可能想要一些进一步的逻辑,但我希望你明白这一点。