私が奇妙なことに出くわしたコードをレビューしたとき、誰かがあなたがABS(CHECKSUM(NewId())) % N
0からN-1までの乱数を取得するために使用できることを読んでいました(RAND()
行ごとには発生しません)が、彼らは実際にコードをテストしなかったと思います(テーブル変数を使用して簡略化され、実際のコードはTOP 1 country
以下の問題を誤って回避しました):
DECLARE @Values TABLE
(
id int identity,
country VARCHAR(100)
)
INSERT INTO @Values (country) VALUES ('UK'), ('USA'), ('China')
SELECT *, (SELECT country FROM @Values v WHERE v.id = ABS(CHECKSUM(NewId())) % 3 + 1)
FROM @Values
実行すると、次のエラーが発生します。
サブクエリは複数の値を返しました。サブクエリが=、!=、<、<=、>、> =の後に続く場合、またはサブクエリが式として使用される場合、これは許可されません。
私の最初の質問は、サブクエリが複数の値をどのように返すことができるかということでした。そして、それが時々まったく価値を返さないのはどうしてですか?(私がSOで尋ねている質問ではないことに注意してください)テスト者:
SELECT country FROM @Values v WHERE v.id = ABS(CHECKSUM(NewId())) % 3 + 1
しかし、次のことが何度実行されても、次のようになります。
SELECT ABS(CHECKSUM(NewId())) % 3 + 1
返される結果は常に1,2,3です(これは、プログラマーがコードを作成するときに使用した「テスト」でした)
このすべてから、これはすべての行ではなくすべての比較に対して再実行されているためだと思います。誰かがこれを確認し、この動作を説明するための適切なリンクを提供して、彼に指摘できるようにすることができますか?