【问题标题】:SQL Server: how can i generate unique random number at each row of record?SQL Server:如何在每行记录中生成唯一的随机数?
【发布时间】:2016-01-11 23:26:29
【问题描述】:

我正在使用 SQL Server 2000。我想在每一行生成随机数而不重复。但是,我的代码不起作用。我尝试了很多次,但我无法解决重复问题。我的代码如下:我使用“case”来处理重复的数字但不起作用。任何人都可以帮助我吗?非常感谢!

DECLARE @index INT
    ,@ran_no INT
    ,@counter INT
    ,@i INT

SET @i = 1

WHILE @i <= 18
BEGIN
    SELECT @index = count(basket_seq)
    FROM dbo.test
    WHERE basket_seq = @i
        AND flag = 'left'

    BEGIN
        UPDATE dbo.test
        SET @ran_no = convert(INT, 1 + @index * RAND(CHECKSUM(NEWID())))
            ,@ran_no = (
                CASE 
                    WHEN convert(INT, 1 + @index * RAND(CHECKSUM(NEWID()))) NOT IN (
                            SELECT seq_no
                            FROM dbo.test
                            WHERE basket_seq = @i
                                AND flag = 'left'
                            )
                        THEN @ran_no
                    END
                )
            ,seq_no = @ran_no
        WHERE basket_seq = @i
            AND flag = 'left'
    END

    SET @i = @i + 1
END

【问题讨论】:

  • 为什么使用case语句?解释一下
  • 因为我想检查“seq_no”列中是否已经存在该随机数。 CASE WHEN convert(INT, 1 + @index * RAND(CHECKSUM(NEWID()))) NOT IN (SELECT seq_no FROM dbo.test WHERE basket_seq = @i AND flag = 'left')
  • 我认为 SQL 2000 中不存在 NEWID()。
  • 随机是一个要求还是目标是有一个唯一的数字?问题是因为你写了“我愿意”,如果这是一个愿望而不是一个要求。
  • 实际上,我想为每一行记录分配唯一编号。如果我只是在每条记录中添加序列号(1,2,3,4.......),恐怕它每次都会显示相同的记录。所以我尝试分配唯一的随机数。

标签: sql-server random sql-server-2000


【解决方案1】:
SELECT RandNumber -- you can set @ran_no with this value in your sql query.
FROM   (
           SELECT ABS(CAST(NEWID() AS BINARY(6)) %500) + 1 RandNumber  --To set max limit number you can replace 500 with any number.
           FROM   sysobjects
       )            SAMPLE
GROUP BY
       RandNumber

正如您所说,您想在 seq_no 中设置值,在您的查询中您已将 @ran_no 设置为 seq_no,因此您应该尝试如下所示。

SET    @ran_no        = (SELECT TOP 1 ABS(CAST(NEWID() AS BINARY(6)) %1000) + 1 FROM   sysobjects)

在每一行生成不重复的随机数。尝试类似上面的东西。会帮助你。

【讨论】:

  • 仍有重复的随机数。我想用唯一的随机数更新“seq_no”列。
  • @wing91 - 我认为它不会有重复的随机数。
  • 出现错误。我们不能在@ran_no 中设置超过 1 个值。更新 dbo.test set seq_no = (SELECT ABS(CAST(NEWID() AS BINARY(6)) % @index) + 1 FROM sysobjects) where basket_seq = @i and flag = 'left'
  • 我认为您在查询中犯了一些错误,您能否在此处提供整个查询,以便我了解为什么会发生此错误。
  • 声明@index int, @i int set @i = 1 while @i
【解决方案2】:

只需检查此link

 SELECT RAND(CAST(NEWID() AS VARBINARY))
   FROM dbo.SysObjects

对于您的更新语句,请像这样使用。

update  dbo.test
set seq_no =  RAND(CAST(NEWID() AS VARBINARY)) --directly given this function here, 
where basket_seq = @i  and flag = 'left'

另外,根据MSDN link,您也可以对 Sqlserver2000 使用 Random 函数。

http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/

【讨论】:

  • 此查询将更新所有具有相同值的记录。
  • 对不起。我不知道你的意思。你能向我解释更多吗?我是 sql 的初学者。 :(谢谢你的帮助
  • 我的最后一个问题是,你要随机否。还是像 1,2,3 ......这样的序列?
  • 亲爱的随机数和序列是 2 个不同的东西.. 所以序列本身随机数没有列表......所以纠正我,因为我知道你想要 1,2,3... 你的表格条目的序列?对!
猜你喜欢
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多