1

dbo.UDF_Q_RandomNumber()0 から 1 の間の浮動型乱数を生成するランダム関数を作成しました。

DECLARE @upper = 10    
DECLARE @lower = 1    

SELECT  
    ROUND(CAST((@lower + (@upper - @lower) * dbo.UDF_Q_RandomNumber()) AS INT), 0) 

上記のコードは、1 から 10 までの乱数を生成します。

#tempTableここで、列Idとを含む 10 行の一時テーブルを作成しましたNumber

Id  Number
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10  10 

SQL クエリ:

CREATE TABLE #tempTable(Id INT, Number INT)

INSERT INTO #tempTable VALUES (1,1)
INSERT INTO #tempTable VALUES (2,2)
INSERT INTO #tempTable VALUES (3,3)
INSERT INTO #tempTable VALUES (4,4)
INSERT INTO #tempTable VALUES (5,5)
INSERT INTO #tempTable VALUES (6,6)
INSERT INTO #tempTable VALUES (7,7)
INSERT INTO #tempTable VALUES (8,8)
INSERT INTO #tempTable VALUES (9,9)
INSERT INTO #tempTable VALUES (10,10)

DECLARE @maxCount INT;

SELECT @maxCount=  COUNT(1) FROM #tempTable

SELECT * FROM #tempTable

SELECT Number 
FROM #tempTable 
WHERE Id = ROUND(CAST((1+(@maxCount-1)*dbo.UDF_Q_RandomNumber())AS INT),0)
DROP TABLE #tempTable

ここでクエリ

SELECT Number 
FROM #tempTable 
WHERE Id = ROUND(CAST((1+(@maxCount-1)*dbo.UDF_Q_RandomNumber()) AS INT), 0)

選択された ID が 1 から 10 (temptable の行) であり、すべての ID にも値があるため、2 行を返すこともあれば null を返すこともあります。

助けてください 。

4

1 に答える 1

0

関数を見ないと言うのは難しいですが、あなたの関数は非決定論的であると思われるので、テーブルの各行に対して解釈されます。

使用rand()する場合は1行のみを返します

 SELECT Number FROM #tempTable WHERE Id= ROUND(CAST((1+(@maxCount-1)*rand())AS INT),0)

または、ランダムな@n行が必要な場合は...

 select top (@n) * from #tempTable order by newid()
于 2012-11-07T11:04:56.927 に答える