2012-07-12 128 views
0

根据模块需求文件名长度为8个字符,为了实现前4个字符DDMM和剩余的4个字符试图从数据库中使用函数和视图获取随机数字,同样的东西我正在使用的数据库我已经粘贴下面:避免生成重复的随机数

功能:

CREATE FUNCTION [dbo].[GenerateRandomNumbersLetters] 
(
    @NumberOfCharacters TINYINT 
) 
RETURNS VARCHAR(32) 
AS 
BEGIN 
    RETURN 
    (
     SELECT LEFT(REPLACE([NewID], '-', ''), @NumberOfCharacters) 
     FROM dbo.RetrieveNewID 
    ); 
END 

查看:

CREATE VIEW [dbo].[RetrieveNewID] 
AS 
    SELECT [NewID] = NEWID(); 

我的查询:

select 
    SUBSTRING(replace(convert(varchar(10), getdate(), 3), '/', ''), 1, 4) + 
    dbo.GenerateRandomNumbersLetters(4) as FileNamerandomNUM 

例:0907CCE7

对于每一行它将提供一个随机数,但在一个场景中最近的随机产生重复的,我如何才能避免这样的情况下也,请指教

+2

我认为没有风险你会尝试在一天内生成更多的65536个文件名? – 2012-07-12 08:02:01

+0

是啊,但我想知道一个特定的文件重复最后四位数的随机数,可以在生成时进行交叉检查吗? – user1494292 2012-07-12 08:04:23

+0

为什么要求为文件名生成一个*随机*序列号?为什么不使用简单的序列号码方案?你无法回答任何'安全',因为出于安全考虑,4位数是可笑的小空间。 – 2012-07-12 08:22:20

回答

1

有对于随机数字有“价值重复”的风险,特别是如果您只取得随机数字的前四位数字。

取而代之的是,生成序列号。实现这一点,你可以创建一个表结构

file_date | seq_no 

Ex: 0907 | 1000 
    0907 | 1001 

则每次你想获得一个文件名,对这个表查询下一个序列号

select max(seq_no)+1 from <table>