在查詢分析器中執行:select rand(),可以看到結果會是類似於這樣的隨機小數:0.36361513486289558,像這樣的小數在實際應用中用得不多,一般要取隨機數都會取隨機整數。那就看下面的兩種隨機取整數的方法:
1、
A:
select floor(rand()*N) ---生成的數是這樣的:12.0
B:
select cast( floor(rand()*N) as int) ---生成的數是這樣的:12
2、
A:select ceiling(rand() * N) ---生成的數是這樣的:12.0
B:select cast(ceiling(rand() * N) as int) ---生成的數是這樣的:12
其中里面的N是一個你指定的整數,如100,可以看出,兩種方法的A方法是帶有.0這個的小數的,而B方法就是真正的整數了。
大致一看,這兩種方法沒什么區別,真的沒區別?其實是有一點的,那就是他們的生成隨機數的范圍:
方法1的數字范圍:0至N-1之間,如cast(floor(rand()*100) as int)就會生成0至99之間任一整數
方法2的數字范圍:1至N之間,如cast(ceiling(rand() * 100) as int)就會生成1至100之間任一整數
對於這個區別,看SQL的聯機幫助就知了:
------------------------------------------------------------------------------------
比較 CEILING 和 FLOOR
CEILING 函數返回大於或等於所給數字表達式的最小整數。FLOOR 函數返回小於或等於所給數字表達式的最大整數。例如,對於數字表達式 12.9273,CEILING 將返回 13,FLOOR 將返回 12。FLOOR 和 CEILING 返回值的數據類型都與輸入的數字表達式的數據類型相同。
----------------------------------------------------------------------------------
現在,各位就可以根據自己需要使用這兩種方法來取得隨機數了^_^
另外,還要提示一下各位菜鳥,關於隨機取得表中任意N條記錄的方法,很簡單,就用newid():
select top N * from table_name order by newid() ----N是一個你指定的整數,表是取得記錄的條數
3,
ROUND() 函數
ROUND 函數用於把數值字段舍入為指定的小數位數。
SQL ROUND() 語法
SELECT ROUND(column_name,decimals) FROM table_name
參數 描述
column_name 必需。要舍入的字段。
decimals 必需。規定要返回的小數位數。
例如:
select ROUND(15.258, 1) 結果是:15.300
可以利用ROUND() 函數與RAND()函數來隨機生成指定區間:
DECLARE @Result INT DECLARE @Upper INT DECLARE @Lower INT SET @Lower = 1 SET @Upper = 10 SELECT @Result = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0) SELECT @Result
以上代碼得到一個[@Lower,@Upper)區間內的數,即最小是@Lower,最大是@Upper-1之間的隨機數。
結合以上知識,寫一個自動生成訂單及配貨清單的存儲過程:
1 USE [KaiFanDB] 2 GO 3 4 /****** Object: StoredProcedure [dbo].[ProcAutoGenerationOfOrders] Script Date: 2016/8/9 13:42:51 ******/ 5 DROP PROCEDURE [dbo].[ProcAutoGenerationOfOrders] 6 GO 7 8 /****** Object: StoredProcedure [dbo].[ProcAutoGenerationOfOrders] Script Date: 2016/8/9 13:42:51 ******/ 9 SET ANSI_NULLS ON 10 GO 11 12 SET QUOTED_IDENTIFIER ON 13 GO 14 15 16 17 -- ============================================= 18 -- Author: <熊學浩> 19 -- Create date: <2016-07-31> 20 -- Description: <自動生成訂單> 21 -- ============================================= 22 CREATE PROCEDURE [dbo].[ProcAutoGenerationOfOrders] 23 -- Add the parameters for the stored procedure here 24 AS 25 BEGIN 26 -- SET NOCOUNT ON added to prevent extra result sets from 27 -- interfering with SELECT statements. 28 SET NOCOUNT ON; 29 30 31 declare @num int; 32 set @num=5; 33 while(@num>0) 34 begin 35 print('@num='+ CONVERT(VARCHAR,@num)); 36 /* 生成訂單開始 */ 37 declare @oid char(14); 38 set @oid=CONVERT(VARCHAR,GETDATE(),112)+ CONVERT(VARCHAR,ROUND(((1000000 - 100000 -1) * RAND() + 100000), 0)); --生成14位純數字訂單號,例如“20160731666666” 39 if(exists(select * from [dbo].[Order] where [OID]=@oid)) 40 begin 41 print ('@oid='+CONVERT(VARCHAR,@oid)+N',訂單號已存在則跳過'); 42 end 43 else 44 begin 45 print ('@oid='+CONVERT(VARCHAR,@oid)+N',訂單號不存在則寫入'); 46 47 declare @uid int; 48 select top(1) @uid=UI.[UID] from [dbo].[Userinfo] as UI inner join [dbo].[UserAddress] as UA on UA.[UID]=UI.[UID] 49 where UI.[UID] not in (select top(10) [buyerUID] from [dbo].[Order] order by [AddTime] desc) --買家用戶離散 50 order by NEWID(); --隨機抽取數據 51 declare @bid int; 52 select top(1) @bid=[BID] from [dbo].[Businesses] 53 where [StatusCode]=1 and [StatusCode]=1 54 and [BID] in (select distinct [BID] from [dbo].[Food]) 55 and [BID] not in (select top(2) [sellerBID] from [dbo].[Order] order by [AddTime] desc) --賣家店鋪離散 56 order by NEWID(); --隨機抽取數據 57 58 declare @totalprice int; 59 set @totalprice=0; 60 61 declare @time datetime; 62 set @time=DATEADD(MI, -cast(floor(rand() * 30) as int), GETDATE()); --生成早於[1-30)分鍾之間的時間,時間分散開使得訂單更逼真 63 64 begin transaction; --開始事務 65 declare @tran_error int; --定義變量,累積事務執行過程中的錯誤 66 set @tran_error = 0; 67 print (N'開始事務'); 68 69 /* 寫入訂單開始 */ 70 declare @buyerName nvarchar(10),@buyerContactWay nvarchar(20),@buyerAddress nvarchar(50),@Sex tinyint,@Description nvarchar(50),@NeedTime nvarchar(20); 71 select top(1) @buyerName=[ContactName],@buyerContactWay=[MobilePhone],@buyerAddress=([Address]+ CONVERT(NVARCHAR,[House])),@Sex=[Sex] from [dbo].[UserAddress] where [UID]=@uid order by [isDefault] desc; 72 set @Description= null 73 set @NeedTime=N'盡快送達'; 74 75 declare @sellerName nvarchar(10),@sellerContactWay nvarchar(20),@sellerAddress nvarchar(50),@sellerDescription nvarchar(50); 76 select top(1) @sellerName=[NickName],@sellerContactWay=(CONVERT(NVARCHAR,[Telephone])+CONVERT(NVARCHAR,[MobilePhone])),@sellerAddress=[Address],@sellerDescription=[ShortDescription] from [dbo].[Businesses] where [BID]=@bid order by [AddTime] desc; 77 78 INSERT INTO [dbo].[Order] VALUES(@oid 79 ,@uid,@buyerName,@buyerContactWay,@buyerAddress,@Description,@NeedTime 80 ,@bid,@sellerName,@sellerContactWay,@sellerAddress,@sellerDescription 81 ,@sellerName,@totalprice,1,@totalprice 82 ,null,null,1,0,null,@time,@Sex,0,0,null); --插入訂單清單 83 ----- 執行語句 84 set @tran_error = @tran_error + @@error; --累積錯誤 85 86 print (N'寫入訂單結束'); 87 /* 寫入訂單結束 */ 88 89 if(@tran_error < 1) 90 begin 91 /* 寫入訂單清單開始 */ 92 declare @foodnumber int; 93 set @foodnumber=cast(ceiling(rand() * 5) as int); --生成[1-5]之間的隨機數 94 print (N'需要寫入 '+CONVERT(VARCHAR,@foodnumber)+N' 條訂單清單'); 95 while(@foodnumber>0) 96 begin 97 declare @fid int; 98 declare @funitprice int; 99 declare @fname nvarchar(12); 100 select top(1) @fid=[FID],@fname=[Name],@funitprice=[UnitPrice] from [dbo].[Food] where [BID]=@bid order by NEWID(); --隨機抽取數據 101 102 declare @fcategoryname nvarchar(10); 103 select top(1) @fcategoryname=FC.[CategoryName] from 104 [dbo].[FoodCategoryRelation] as FCR 105 inner join [dbo].[FoodCategory] as FC on FC.[FCID]=FCR.[FCID] 106 where FCR.[FID]=@fid; 107 108 INSERT INTO [dbo].[OrderBill] VALUES(@oid,@fid,@fname,@funitprice,@fcategoryname,1,GETDATE()); --插入訂單清單 109 ----- 執行語句 110 set @tran_error = @tran_error + @@error; --累積錯誤 111 112 set @totalprice=@totalprice + (@funitprice * 1); 113 print (N'寫入一條訂單清單完成,@foodnumber='+CONVERT(NVARCHAR,@foodnumber)+ N',@totalprice='+CONVERT(NVARCHAR,@totalprice)); 114 115 set @foodnumber=@foodnumber-1; 116 end 117 118 print (N'寫入訂單清單結束,@foodnumber='+CONVERT(NVARCHAR,@foodnumber)+ N',@totalprice='+CONVERT(NVARCHAR,@totalprice)); 119 /* 寫入訂單清單結束 */ 120 121 if(@totalprice>0) 122 begin 123 update [dbo].[Order] set [TotalPrice]=@totalprice,[PayPrice]=@totalprice,[PayMethod]=1,[PayTime]=null,[OrderStatus]=1 where [OID]=@oid; 124 ----- 執行語句 125 set @tran_error = @tran_error + @@error; --累積錯誤 126 127 print (N'修改訂單結束'); 128 end 129 130 end 131 132 133 --判斷要回滾或提交事物 134 if(@tran_error <> 0) --有誤 135 begin 136 print (N'回滾事務'); 137 rollback transaction; 138 end 139 else 140 begin 141 print (N'提交事務'); 142 commit transaction; 143 set @num=@num-1; 144 end 145 146 end 147 /* 生成訂單結束 */ 148 149 end 150 151 152 END 153 154 155 156 GO