1

従業員のリストに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

誰かがこれを行う方法に光を当てることができますか?ありがとう

4

2 に答える 2

4

mssqlサーバー2005以降で動作します

select personnum, firstnm, lastnm, row_number() over (order by newid()) randomnumber
from person
于 2012-08-30T14:23:06.590 に答える
0

そのための関数を作成します。これが私たちが使用するものです:

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

パラメータと許可される値を変更して、必要な数のタイプであることを確認できます。

于 2012-08-30T14:10:13.217 に答える