在查詢分析器中執行:select rand(),可以看到結果會是類似於這樣的隨機小數:0.36361513486289558,像這樣的小數在實際應用中用得不多,一般要取隨機數都會取隨機整數。那就看下麵的兩種隨機取整數的方法:1、A:select floor(rand()*N) 生成的數是這樣的:12 ...
在查詢分析器中執行: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/7/31 13:33:38 ******/ 5 SET ANSI_NULLS ON 6 GO 7 8 SET QUOTED_IDENTIFIER ON 9 GO 10 11 12 13 -- ============================================= 14 -- Author: <熊學浩> 15 -- Create date: <2016-07-31> 16 -- Description: <自動生成訂單> 17 -- ============================================= 18 CREATE PROCEDURE [dbo].[ProcAutoGenerationOfOrders] 19 -- Add the parameters for the stored procedure here 20 AS 21 BEGIN 22 -- SET NOCOUNT ON added to prevent extra result sets from 23 -- interfering with SELECT statements. 24 SET NOCOUNT ON; 25 26 27 declare @num int; 28 set @num=5; 29 while(@num>0) 30 begin 31 print('@num='+ CONVERT(VARCHAR,@num)); 32 /* 生成訂單開始 */ 33 declare @oid char(14); 34 set @oid=CONVERT(VARCHAR,GETDATE(),112)+ CONVERT(VARCHAR,ROUND(((1000000 - 100000 -1) * RAND() + 100000), 0)); 35 if(exists(select * from [dbo].[Order] where [OID]=@oid)) 36 begin 37 print ('@oid='+CONVERT(VARCHAR,@oid)+N',已存在則跳過'); 38 end 39 else 40 begin 41 print ('@oid='+CONVERT(VARCHAR,@oid)+N',不存在則寫入'); 42 43 declare @uid int; 44 select top(1) @uid=UI.[UID] from [dbo].[Userinfo] as UI inner join [dbo].[UserAddress] as UA on UA.[UID]=UI.[UID] order by NEWID(); --隨機抽取數據 45 declare @bid int; 46 select top(1) @bid=[BID] from [dbo].[Businesses] where [StatusCode]=1 and [StatusCode]=1 and [BID] in(select distinct [BID] from [dbo].[Food]) order by NEWID(); --隨機抽取數據 47 48 declare @totalprice int; 49 set @totalprice=0; 50 51 declare @time datetime; 52 set @time=DATEADD(MI, -cast(floor(rand() * 30) as int), GETDATE()); --生成早於[1-30)分鐘之間的時間,時間分散開使得訂單更逼真 53 54 begin transaction; --開始事務 55 declare @tran_error int; --定義變數,累積事務執行過程中的錯誤 56 set @tran_error = 0; 57 print (N'開始事務'); 58 59 /* 寫入訂單開始 */ 60 declare @buyerName nvarchar(10),@buyerContactWay nvarchar(20),@buyerAddress nvarchar(50),@Sex tinyint,@Description nvarchar(50),@NeedTime nvarchar(20); 61 select top(1) @buyerName=[ContactName],@buyerContactWay=[MobilePhone],@buyerAddress=([Address]+ CONVERT(NVARCHAR,[House])),@Sex=[Sex] from [dbo].[UserAddress] where [UID]=@uid order by [isDefault] desc; 62 set @Description= null 63 set @NeedTime=N'儘快送達'; 64 65 declare @sellerName nvarchar(10),@sellerContactWay nvarchar(20),@sellerAddress nvarchar(50),@sellerDescription nvarchar(50); 66 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; 67 68 INSERT INTO [dbo].[Order] VALUES(@oid 69 ,@uid,@buyerName,@buyerContactWay,@buyerAddress,@Description,@NeedTime 70 ,@bid,@sellerName,@sellerContactWay,@sellerAddress,@sellerDescription 71 ,@sellerName,@totalprice,1,@totalprice 72 ,null,null,1,0,null,@time,@Sex,0,0,null); --插入訂單清單 73 ----- 執行語句 74 set @tran_error = @tran_error + @@error; --累積錯誤 75 76 print (N'寫入訂單結束'); 77 /* 寫入訂單結束 */ 78 79 if(@tran_error < 1) 80 begin 81 /* 寫入訂單清單開始 */ 82 declare @foodnumber int; 83 set @foodnumber=cast(ceiling(rand() * 5) as int); --生成[1-5]之間的隨機數 84 print (N'需要寫入 '+CONVERT(VARCHAR,@foodnumber)+N' 條訂單清單'); 85 while(@foodnumber>0) 86 begin 87 declare @fid int; 88 declare @funitprice int; 89 declare @fname nvarchar(12); 90 select top(1) @fid=[FID],@fname=[Name],@funitprice=[UnitPrice] from [dbo].[Food] where [BID]=@bid order by NEWID(); --隨機抽取數據 91 92 declare @fcategoryname nvarchar(10); 93 select top(1) @fcategoryname=FC.[CategoryName] from 94 [dbo].[FoodCategoryRelation] as FCR 95 inner join [dbo].[FoodCategory] as FC on FC.[FCID]=FCR.[FCID] 96 where FCR.[FID]=@fid; 97 98 INSERT INTO [dbo].[OrderBill] VALUES(@oid,@fid,@fname,@funitprice,@fcategoryname,1,GETDATE()); --插入訂單清單 99 ----- 執行語句 100 set @tran_error = @tran_error + @@error; --累積錯誤 101 102 set @totalprice=@totalprice + (@funitprice * 1); 103 print (N'寫入一條訂單清單完成,@foodnumber='+CONVERT(NVARCHAR,@foodnumber)+ N',@totalprice='+CONVERT(NVARCHAR,@totalprice)); 104 105 set @foodnumber=@foodnumber-1; 106 end 107 108 print (N'寫入訂單清單結束,@foodnumber='+CONVERT(NVARCHAR,@foodnumber)+ N',@totalprice='+CONVERT(NVARCHAR,@totalprice)); 109 /* 寫入訂單清單結束 */ 110 111 if(@totalprice>0) 112 begin 113 update [dbo].[Order] set [TotalPrice]=@totalprice,[PayPrice]=@totalprice,[PayMethod]=1,[PayTime]=null,[OrderStatus]=1 where [OID]=@oid; 114 ----- 執行語句 115 set @tran_error = @tran_error + @@error; --累積錯誤 116 117 print (N'修改訂單結束'); 118 end 119 120 end 121 122 123 --判斷要回滾或提交事物 124 if(@tran_error <> 0) --有誤 125 begin 126 print (N'回滾事務'); 127 rollback transaction; 128 end 129 else 130 begin 131 print (N'提交事務'); 132 commit transaction; 133 set @num=@num-1; 134 end 135 136 end 137 /* 生成訂單結束 */ 138 139 end 140 141 142 END 143 144 145 146 GO