因爲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