[英]Generate random tokens (unique id's) for users in a table in SQL server
我想在sql server中创建一个表,并用数据(人们的信息)填充它。 目标是在第一行中为每个人提供唯一的ID,该ID必须以固定的字母GM
开头,后跟AZ
或2-9
数字,名字的首字母,姓氏的首AZ
和AZ
或2-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.