SQL Server 隨機數,隨機區間,隨機抽取數據rand(),floor(),ceiling(),round(),newid()函數等

来源:http://www.cnblogs.com/xiongzaiqiren/archive/2016/07/31/5722518.html
-Advertisement-
Play Games

在查詢分析器中執行: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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [TOC] 在CSS中對元素進行 水平居中 是非常簡單的:如果它是一個行內元素,就對它的父元素應用 ;如果它是一個塊級元素,就對它自身應用 。然而要對一個元素進行垂直居中,就有點束手無策了,本文介紹了幾種常用的垂直居中方法以供參考! 一、表格佈局法 利用表格的vertical align屬性,當然首 ...
  • × 目錄 [1]圖示 [2]概念 [3]說明[4]總結 前面的話 對於執行環境(execution context)和作用域(scope)並不容易區分,甚至很多人認為它們就是一回事,只是高程和犀牛書關於作用域的兩種不同翻譯而已。但實際上,它們並不相同,卻相互糾纏在一起。本文先用一張圖開宗明義,然後進 ...
  • 類的基本寫法: constructor構造函數其實就相當於ES5中的構造函數,用於定義類的實例屬性; 而在類中定義的其他方法像這裡的toString方法就相當於ES5中定義在原型prototype上的共用方法。 就是語法糖嘛。 constructor方法 這是類的預設方法,類必須有該方法,如果沒有顯 ...
  • 總結一下自己給編輯器定製樣式的過程中所遇到的問題,主要是編輯器的二次開發介面,以及用angular定製樣式,問題不少,終於在**的幫助下,完成了,還剩下老版本和新版本的交互沒有弄好,不過不難。下麵分別講解問題。 ueditor的開發 你可以在官網上下載任意版本,進行使用即可:http://uedit ...
  • JS DOM 來控制HTML元素 (ps:這個有很多方法,挑一些詳解,嘻嘻) 1.getElementsByName():獲取name. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 例:<p name="pn">hello</p> <p name="pn">hello</ ...
  • JavaScript借鑒了許多語言的特點;例如語法類Java、函數借鑒Scheme、原型繼承借鑒自Self、正則表達式借鑒於Perl。(DC Javascript:語言精粹)。 首先,每個JS是一門基於原型繼承的面向對象的語言。裡面數組是對象、函數是對象、“對象”當然還是對象。而且每個對象都有一個i ...
  • SQL:Structured Quety Language SQL SERVER是一個以客戶/伺服器(c/s)模式訪問、使用Transact-SQL語言的關係型資料庫管理子系統(RDBMS) DBMS :Database Management System資料庫管理系統 資料庫:程式用來存取數據的 ...
  • 最近因為項目原因需要在阿裡雲伺服器上部署mongodb,網上查閱了一些資料,特此記錄一下步驟 1.運行apt-get install mongodb命令安裝mongodb服務(如果提示找不到該package,說明apt-get的資源庫版本比較舊,運行apt-get update來更新資源庫) 2.安 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...