我有一个申请表,对于每个表单提交,我想生成一个随机Id(在0000001和1000000之间,之前没有用过同一个表(生成后要检查)。有很多例子但是我需要生成一个随机的唯一ID,并检查它是否曾被使用过。想知道在ASP.NET MVC中这样做吗?
答案 0 :(得分:1)
我在我们的项目中使用了它。
DECLARE @RandNum INT;
DECLARE @Upper INT ;
DECLARE @Lower INT ;
SET @Lower = 100000
-- The lowest random number
SET @Upper = 999999
-- The highest random number
GENERATE_OTP:
SET @RandNum = @Lower + CONVERT(INT, ( @Upper - @Lower + 1 ) * RAND(CAST(NEWID() AS VARBINARY)))
IF EXISTS( SELECT 'x' FROM Yourtable WHERE RandNum = @RandNum )
GOTO GENERATE_RandNum;
SELECT @RandNum
答案 1 :(得分:1)
我会这样走(或多或少像卡拉所说,但我试图实施一个例子)。这样您就可以使用所选的数字。正如@Chris在Carra's answer中提到的,您应该考虑使用锁定(此处未显示):
-- This would be the table where you use the generated IDs:
create table used_values (id int primary key);
insert used_values values(1), (2), (5), (9), (11), (16), (17);
-- by the way of example, suppose I want to generate a random number which is
-- bound between 1 and 20.
-- Initially populate a table of all numbers between 1 and 20.
例如,使用this approach生成numbers
表:
create table numbers(number int);
insert numbers (number)
-- In your situation use 100000 in place of 20.
select top 20 row_number() over (order by t1.number) as N
from master..spt_values t1 cross join master..spt_values t2;
-- how many "slots" are free?
declare @free int, @random int;
select @free = 20 - count(*) from used_values;
-- pick a random integer between 1 and @free
这可以在this answer中完成:
select @random = rand()*@howmany + 1;
-- find the "free slot" corresponding to the random number:
select number from (
select rownum = row_number() over(order by id), a.number
from numbers a left join used_values b on a.number = b.id
where b.id is null
) x where x.rownum = @random;
答案 2 :(得分:0)
答案 3 :(得分:0)
非常感谢所有试图帮助并投票给他们的人...最后我在MVC中使用了以下方法:
//Generate randon number for Submission Id
int n = 0;
Boolean check = true;
//check if exist
do {
Random r = new Random();
n = r.Next();
string query = "SELECT CASE WHEN EXISTS(SELECT * FROM [SubmitTable] WHERE
[SubmitNo] = " + n + ") THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END";
check = db.Database.SqlQuery<Boolean>(query).FirstOrDefault();
}
while (check);
model.SubmitNo = n;