因为SQL Server没有数组类型,因此在面对“从若干待选项中选一个”这种需求时,每每要采起变通办法,好比弄个‘a|b|c’这样的字符串而后对字符串进行处理;又或者把待选项塞进一个临时表,而后把问题变成如何select的问题。下面的写法就是采用后一种,只不过得益于VALUES和CTE,咱们没必要真的一板一眼的去弄个临时表或表变量什么的,能够让代码更加紧凑,不至于很冗杂。数组
DECLARE @choice INT = ( SELECT Amount FROM (VALUES ( 88, 0) ,(118, 1) ,(138, 2) ,(188, 3) --缺点1:须要手动编号,有弄错的可能 ) AS a(Amount,RowNo) WHERE RowNo = FLOOR(4*RAND())) --缺点2:须要手动指定待选项数目,有弄错的可能
WITH前加分号是一种保险的写法,不然可能遇到消息336的语法问题。函数
DECLARE @choice INT ;WITH cte AS (SELECT ROW_NUMBER() OVER(ORDER BY Num) AS RowNo,Num FROM (VALUES (88) ,(118) ,(138) ,(188) ) AS a(Num)) SELECT @choice=Num FROM cte WHERE RowNo=CEILING((SELECT COUNT(1) FROM cte)*RAND())
受评论区@张工502219048指教,利用newid()这个函数的特性,order by newid()结合top 1就能达到随机选取的效果,根本不用编号和rand,使得写法可以大大简化,在此对他表示感谢。spa
DECLARE @choice INT = ( SELECT TOP 1 Num FROM (VALUES (88) ,(118) ,(138) ,(188) ) AS a(Num) ORDER BY NEWID())
求更好写法,感谢。code
-EOF-blog