1

32 文字のランダム ID を生成するために呼び出すことができる関数を作成しようとすると、少し問題が発生します。クエリエディターで動作していますが、テーブルからの既存のデータを伴う複数行の結果でこれを生成するには、関数を作成して呼び出す必要があることを理解しています。これが私のコードです:

CREATE FUNCTION [dbo].[Func_Gen_OID] (@NewOID varchar(32))
RETURNS VARCHAR(32) AS
BEGIN

DECLARE @Length int = 32
DECLARE @Output varchar(32)
DECLARE @counter smallint
DECLARE @RandomNumber float
DECLARE @RandomNumberInt tinyint
DECLARE @CurrentCharacter varchar(1)
DECLARE @ValidCharacters varchar(255)
SET @ValidCharacters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
DECLARE @ValidCharactersLength int
SET @ValidCharactersLength = len(@ValidCharacters)
SET @CurrentCharacter = ''
SET @RandomNumber = 0
SET @RandomNumberInt = 0
SET @Output = ''

SET NOCOUNT ON

SET @counter = 1

WHILE @counter < (@Length + 1)

BEGIN

        SET @RandomNumber = Rand()
        SET @RandomNumberInt = Convert(tinyint, ((@ValidCharactersLength - 1) * @RandomNumber + 1))

        SELECT @CurrentCharacter = SUBSTRING(@ValidCharacters, @RandomNumberInt, 1)

        SET @counter = @counter + 1

        SET @Output = @Output + @CurrentCharacter

RETURN @Output
END

助けてくれてありがとう!

4

3 に答える 3

4

RAND() 関数の代わりに、これを使用します。

create view ViewRandomNumbers 
as 
   select rand( ) as Number 
go 
于 2012-10-23T09:43:30.490 に答える
2

次のエラーが表示されていると思います。

Invalid use of a side-effecting operator 'rand' within a function.

ユーザー定義関数内で RAND() を直接使用することはできません (仲介としてビューが必要です)。この場合、可変シードを指定していないため (関数の呼び出しごとに異なる)、RAND はクエリのすべての行に対して同じ値を返します。関数内の残りのロジックをカプセル化する場合は、他の場所からランダムに生成された値を渡す必要があります。これは、おそらく CHECKSUM() および NEWID() によって生成されます。

このSQL Server Central スレッドで言及されているいくつかの可能性があります

于 2012-05-10T15:47:18.730 に答える