SQL 服务器随机插入

SQL Server Insert Random

我有这个 table:

Create Table Person
(
Consecutive Integer Identity(1,1),
Identification Varchar(15) Primary Key,
)

Identification栏可以包含字母,数字,是可选的,即客户可以输入也可以不输入,如果不输入则自动创建一个数字..如何插入一个不存在的随机数之前?,最好是较小的数字。

例如:

Select Random From Person Where Random Not Exists In Identification 

这是我的代码:

Select Min(Convert(Integer,Identification)) - 1 
From Person 
Where IsNumeric(Identification) = 1

Select Max(Convert(Integer,Identification)) + 1 
From Person 
Where IsNumeric(Identification) = 1

效果很好,但如果客户输入的数字很大,例如 1000 或更高,那么数字将从那里开始,可能会出现溢出错误

但如果没有低于 Identification 且大于 0 的数字,则可以为 -1、-2、-3 等

提前致谢..

维护 VARCHAR(15) 的随机数,这取决于最终用户的输入,当您还希望它是唯一的时,这可能是一种非常昂贵的方法。

想象一个场景,当你有相当数量的行时,比如在这个 table 中有 10,000 行,并且用户进来试图插入一个随机数,用户可能会尝试 5、10 甚至可能15 次得到唯一的随机值。

每次尝试失败时,将调用服务器,将在 table 上进行搜索(此查询的行数越多,成本越高),并且用户进行的(失败)尝试次数越多disappointment/poor 用户将拥有的应用程序体验。

您是否会回到一个应用程序(web/windwos),在那里您只是为了注册而奋斗了这么多次?明显不是。

这个故事的寓意是,如果您要求用户输入一些随机值,不要指望用户维护您的数据库完整性并保持该列的唯一性,控制并将该值与另一列配对,这肯定会是随机的。在您的情况下,它可以是身份列。或者您可以使用 guid 自己为用户生成该值。

我同意M.Ali所说的。但是你可以只使用下面的代码,但我仍然不推荐超出 M.Ali 所说的内容。

循环继续,直到生成一个不在您的 table 中的随机数。您可以通过将 1000 更改为 10000 等将精度更改为 5 位数字。

DECLARE @I INT = 0
DECLARE @RANDOM INT;

WHILE(@I=0)
BEGIN       

    SELECT @RANDOM = 1000 + (CONVERT(INT, CRYPT_GEN_RANDOM(3)) % 1000);

    IF NOT EXISTS(SELECT Identification FROM YOURTABLE WHERE Identification = CAST(@RANDOM AS VARCHAR(4)))
    BEGIN

        -- Do your stuff here       
        BREAK;
    END
    ELSE
    BEGIN
         -- The ELSE part
    END 

END
select count(*) +1 from Person

这会为 Identification 生成一个逻辑 ID,它使用一个简单的增量器将 ID 设置为它 'would have been' 的值。 但是,您不能删除记录;相反,您必须停用它们,或清除该行。

或者,有一个仅自动递增的单独(隐藏)列,如果 Identification 留空,则使用隐藏列中的值。结果相同,但如果删除相关则风险较小。