SQL Server:如何在每行记录中生成唯一的随机数?

问题描述 投票:1回答:2

我正在使用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
sql-server random sql-server-2000
2个回答
0
投票

请检查这个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,您可以使用Sql Server 2000的随机函数工具。

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


0
投票
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)

在每行产生随机数而不重复。尝试上面的东西。会帮助你。

© www.soinside.com 2019 - 2024. All rights reserved.