SQL Server中SELECT查询中的随机函数行为

时间:2012-11-07 10:55:38

标签: sql sql-server

我写了一个随机函数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,其中包含10行,其中包含IdNumber列。

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)

有时它会返回2行,有时会返回null,因为Id选择的值在1到10之间(temptable中的行),每个Id也有值。

请帮忙。

1 个答案:

答案 0 :(得分:0)

没有看到这个函数,很难说,但我怀疑你的函数是非确定性的,所以它会被解释为表的每一行。

如果使用rand(),则只返回一行

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

或者,如果您只想要一个随机的@n行......

 select top (@n) * from #tempTable order by newid()