繁体   English   中英

在SQL Server的表中为用户生成随机令牌(唯一ID)

[英]Generate random tokens (unique id's) for users in a table in SQL server

我想在sql server中创建一个表,并用数据(人们的信息)填充它。 目标是在第一行中为每个人提供唯一的ID,该ID必须以固定的字母GM开头,后跟AZ2-9数字,名字的首字母,姓氏的首AZAZ2-9

注意:使用您要求的逻辑,我认为您不检查表是否不包含生成的值就无法生成唯一值,唯一的方法是使用生成GUID的NEWID()函数,否则我认为总是有重复的风险

我不知道这是否是最好的方法,但是我可以说它给出了预期的输出。 您可以创建此函数并将其用于生成标识符:

ALTER FUNCTION dbo.CreateIdentifier
(
    -- Add the parameters for the function here
    @Firstname varchar(255),
    @Lastname varchar(255),
    @random1 decimal(18,10) ,
    @random2 decimal(18,10)
)
RETURNS varchar(10)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @S VARCHAR(10)
    DECLARE @S1 VARCHAR(1)
    DECLARE @S2 VARCHAR(1)
    DECLARE @len INT
    DECLARE @Random1Fixed INT
    DECLARE @Random2Fixed INT

    declare @alphabet varchar(36) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ23456789'



    SET @alphabet = REPLACE(@alphabet,LEFT(@Lastname,1),'')
    SET @alphabet = REPLACE(@alphabet,LEFT(@Firstname,1),'')

    SELECT @len = len(@alphabet)
    SET @Random1Fixed = ROUND(((@len - 1 -1) * @random1 + 1), 0)
    SET @Random2Fixed = ROUND(((@len - 1 -1) * @random2 + 1), 0)


    SET @S1 = substring(@alphabet, convert(int, @Random1Fixed ), 1)
    SET @S2 = substring(@alphabet, convert(int, @Random2Fixed), 1)

    SET @S = 'GM' + @S1 + LEFT(@Firstname,1) + LEFT(@Lastname,1) + @S2
    RETURN @S

END

您可以将其用作以下内容

SELECT dbo.CreateIdentifier('John','Wills',RAND(),RAND())

我将RAND()作为参数传递,因为它不能在函数中使用

您的问题有两个含糊之处,但希望您通读此书后能够填补空白。

您可能要问的一个问题是,您是否真的想遵守所提供的ID约束。 使用标识列可能更有意义(请参阅: https : //docs.microsoft.com/zh-cn/sql/t-sql/statements/create-table-transact-sql-identity-property )。

确切的语法取决于您使用的SQL语言。 看看这个: https//www.w3schools.com/sql/sql_autoincrement.asp

对于MS SQL Server,它看起来像这样:

create table User (
   [UserID] int IDENTITY(1,1) PRIMARY KEY,
   [FirstName] varchar(50) not null,
   [LastName] varchar(50) not null
)

假设您用一些条目填充了该表。 如果出于某些任意要求,您需要在前面加“ GM”,并在末尾使用用户的姓名缩写,则可以执行以下操作:

select 'GM'+UserID+'substring(FirstName,0,1)+substring(LastName,0,1) from User

为了更直接地回答您的问题,您似乎要求每个用户都具有一个类似于GM[AZ or 2-9][FirstInitial][LastInitial][AZ or 2-9)]的ID。

这种设置会让您更加头疼,但这当然是可行的。 请注意,据我所知,在GM之后仅包含一个字符AZ / 0-9,而在首字母之后具有另一个字符将为您提供非常有限的可能的唯一ID。

您没有提供ID字符的最大长度,因此我假设整个长度固定为6个字符(“ G”,“ M”,“ AZ / 2-9”,“ F”,“ L”,“ AZ / 2-9" )。 如果我误解了您,那肯定会改变答案,但希望它仍然有用。

您可以创建一个User表和一个包含可能的字符的表,如下所示:

create table UserTable  (
    ID varchar(50),
    FirstName varchar(50),
    LastName varchar(50)
)

create table PChars (
    Possibility varchar(1)
)

insert into PChars (Possibility) values
('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L'),('M'),('N'),('O'),('P'),('Q'),('R'),('S'),('T'),('U'),('V'),('W'),('X'),('Y'),('Z'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9')

然后,您可以反复运行以下内容,请注意,即使John和Jane的姓名首字母相同,它们也永远不会具有相同的ID。 while子句禁止使用。

还要注意,最终这将打破。 如果表中有足够多的人使用相同的首字母缩写,则while子句可能会变成无限循环。 这就是为什么这是一个坏主意!!!

delete UserTable /*this is just here so you can run this code over and over*/

/*John Doe*/
declare @FirstName varchar(50) = 'John'
declare @LastName varchar(50) = 'Doe'
declare @newID varchar(50) = ''
while(@newID = '' or @newID in (select distinct ID from UserTable))
  begin
    select @newID = 'GM'+(select top 1 Possibility from PChars order by newid())+substring(@FirstName,1,1)+substring(@LastName,1,1)+(select top 1 Possibility from PChars order by newid())
  end
insert into UserTable select @newID,@FirstName,@LastName

/*Jane Doe*/
select @FirstName = 'Jane'
select @LastName = 'Doe'
select @newID = ''
while(@newID = '' or @newID in (select distinct ID from UserTable))
  begin
    select @newID = 'GM'+(select top 1 Possibility from PChars order by newid())+substring(@FirstName,1,1)+substring(@LastName,1,1)+(select top 1 Possibility from PChars order by newid())
  end
insert into UserTable select @newID,@FirstName,@LastName

select * from UserTable

这是一些示例输出:

+--------+-----------+----------+
|   ID   | FirstName | LastName |
+--------+-----------+----------+
| GMOJDF | John      | Doe      |
| GM2JDD | Jane      | Doe      |
+--------+-----------+----------+

再说一遍,我觉得我在误解您的问题,但是我认为这为您提供了一个很好的起点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM