我需要为雇员列表分配一个从1到1000 (或任意数量的雇员)之间的唯一数字。这些数字不能重复,需要在员工列表中以随机顺序排列。每周还需要重新生成编号,以便为员工分配一个新编号。
我尝试使用以下代码,但是脚本速度很慢,它为所有员工返回相同的数字。
DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
SET @Lower = 1
SET @Upper = 1000
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
select personnum, firstnm, lastnm, (SELECT @Random)
from person有人能解释一下如何做到这一点吗?谢谢
发布于 2012-08-30 22:23:07
可在mssql server 2005+上运行。
select personnum, firstnm, lastnm, row_number() over (order by newid()) randomnumber
from person发布于 2012-08-30 22:10:13
为它创建一个函数。下面是我们使用的方法:
ALTER FUNCTION [dbo].[fn_GenerateUniqueNumber]()
RETURNS char(10)
AS
BEGIN
--DECLARE VARIABLES
DECLARE @RandomNumber VARCHAR(10)
DECLARE @I SMALLINT
DECLARE @RandNumber FLOAT
DECLARE @Position TINYINT
DECLARE @ExtractedCharacter VARCHAR(1)
DECLARE @ValidCharacters VARCHAR(255)
DECLARE @VCLength INT
DECLARE @Length INT
--SET VARIABLES VALUE
SET @ValidCharacters = '0123456789'
SET @VCLength = LEN(@ValidCharacters)
SET @ExtractedCharacter = ''
SET @RandNumber = 0
SET @Position = 0
SET @RandomNumber = ''
SET @Length = 10
SET @I = 1
WHILE @I < ( @Length + 1 )
BEGIN
SET @RandNumber = (SELECT RandNumber FROM [RandNumberView])
SET @Position = CONVERT(TINYINT, ( ( @VCLength - 1 ) * @RandNumber + 1 ))
SELECT @ExtractedCharacter = SUBSTRING(@ValidCharacters, @Position, 1)
SET @I = @I + 1
SET @RandomNumber = @RandomNumber + @ExtractedCharacter
END
RETURN @RandomNumber
END要使用它,请执行以下操作:
SELECT personnum, firstnm, lastnm,dbo.fn_GenerateUniqueNumber()
FROM person您可以修改参数和允许值,以确保它是您想要的数字类型。
https://stackoverflow.com/questions/12198729
复制相似问题