ドキュメントを少し検索して読んだ後、本体内で使用されている組み込み関数に応じて決定論的または非決定論的としてマークされたユーザー定義関数をSQLServerで記述できることは明らかです。
RAND()は、非決定論的関数の下にリストされています(msdnの記事を参照)。では、なぜ関数で使用できないのですか?
ドキュメントを少し検索して読んだ後、本体内で使用されている組み込み関数に応じて決定論的または非決定論的としてマークされたユーザー定義関数をSQLServerで記述できることは明らかです。
RAND()は、非決定論的関数の下にリストされています(msdnの記事を参照)。では、なぜ関数で使用できないのですか?
ビューを使用するとうまくいく場合があります。
selectステートメントからの乱数の返送から
CREATE VIEW vRandNumber
AS
SELECT RAND() as RandNumber
すでにご存知のように、UDFは関数を非決定的にするためにrand()関数を使用できないため、このビューが必要です。ビューを使用して、UDFをだまして乱数を受け入れることができます。
CREATE FUNCTION RandNumber()
RETURNS float
AS
BEGIN
RETURN (SELECT RandNumber FROM vRandNumber)
END
最後に、この関数を任意のSELECTで使用して、行ごとに0〜1の乱数を返すことができます。
SELECT dbo.RandNumber(), *
FROM Northwind..Customers
副作用があるからです。
副作用のある構成は関数では許可されていません。rand()
それが持つ副作用は、最後に発行された値を追跡する内部状態を変更することです。
ビュー定義に含めてビューから選択することで回避できると思います。
ビューを作成しないこのソリューションを見つけました:
基本的に:
それ以外の
SET @R = Rand()
使用する
SET @R = ABS(CHECKSUM(PWDENCRYPT(N''))) / 2147483647.0
私の場合、1から10までの数字が必要でした。
ROUND(((10 - 1 -1) * ( ABS(CHECKSUM(PWDENCRYPT(N''))) / 2147483647.0) + 1), 0))
ROUND(((@max - @lower -1) * ( ABS(CHECKSUM(PWDENCRYPT(N''))) / 2147483647.0) + @lower), 0))
完全な説明が必要な場合:T-Sqlユーザー定義関数でのRand()の使用(またはシミュレーション)