在查询分析器中执行: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之间的随机数。

结合以上知识,写一个自动生成订单及配货清单的存储过程:

 USE [KaiFanDB]
GO /****** Object: StoredProcedure [dbo].[ProcAutoGenerationOfOrders] Script Date: 2016/8/9 13:42:51 ******/
DROP PROCEDURE [dbo].[ProcAutoGenerationOfOrders]
GO /****** Object: StoredProcedure [dbo].[ProcAutoGenerationOfOrders] Script Date: 2016/8/9 13:42:51 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO -- =============================================
-- Author: <熊学浩>
-- Create date: <2016-07-31>
-- Description: <自动生成订单>
-- =============================================
CREATE PROCEDURE [dbo].[ProcAutoGenerationOfOrders]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON; declare @num int;
set @num=5;
while(@num>0)
begin
print('@num='+ CONVERT(VARCHAR,@num));
/* 生成订单开始 */
declare @oid char(14);
set @oid=CONVERT(VARCHAR,GETDATE(),112)+ CONVERT(VARCHAR,ROUND(((1000000 - 100000 -1) * RAND() + 100000), 0)); --生成14位纯数字订单号,例如“20160731666666”
if(exists(select * from [dbo].[Order] where [OID]=@oid))
begin
print ('@oid='+CONVERT(VARCHAR,@oid)+N',订单号已存在则跳过');
end
else
begin
print ('@oid='+CONVERT(VARCHAR,@oid)+N',订单号不存在则写入'); declare @uid int;
select top(1) @uid=UI.[UID] from [dbo].[Userinfo] as UI inner join [dbo].[UserAddress] as UA on UA.[UID]=UI.[UID]
where UI.[UID] not in (select top(10) [buyerUID] from [dbo].[Order] order by [AddTime] desc) --买家用户离散
order by NEWID(); --随机抽取数据
declare @bid int;
select top(1) @bid=[BID] from [dbo].[Businesses]
where [StatusCode]=1 and [StatusCode]=1
and [BID] in (select distinct [BID] from [dbo].[Food])
and [BID] not in (select top(2) [sellerBID] from [dbo].[Order] order by [AddTime] desc) --卖家店铺离散
order by NEWID(); --随机抽取数据 declare @totalprice int;
set @totalprice=0; declare @time datetime;
set @time=DATEADD(MI, -cast(floor(rand() * 30) as int), GETDATE()); --生成早于[1-30)分钟之间的时间,时间分散开使得订单更逼真 begin transaction; --开始事务
declare @tran_error int; --定义变量,累积事务执行过程中的错误
set @tran_error = 0;
print (N'开始事务'); /* 写入订单开始 */
declare @buyerName nvarchar(10),@buyerContactWay nvarchar(20),@buyerAddress nvarchar(50),@Sex tinyint,@Description nvarchar(50),@NeedTime nvarchar(20);
select top(1) @buyerName=[ContactName],@buyerContactWay=[MobilePhone],@buyerAddress=([Address]+ CONVERT(NVARCHAR,[House])),@Sex=[Sex] from [dbo].[UserAddress] where [UID]=@uid order by [isDefault] desc;
set @Description= null
set @NeedTime=N'尽快送达'; declare @sellerName nvarchar(10),@sellerContactWay nvarchar(20),@sellerAddress nvarchar(50),@sellerDescription nvarchar(50);
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; INSERT INTO [dbo].[Order] VALUES(@oid
,@uid,@buyerName,@buyerContactWay,@buyerAddress,@Description,@NeedTime
,@bid,@sellerName,@sellerContactWay,@sellerAddress,@sellerDescription
,@sellerName,@totalprice,1,@totalprice
,null,null,1,0,null,@time,@Sex,0,0,null); --插入订单清单
----- 执行语句
set @tran_error = @tran_error + @@error; --累积错误 print (N'写入订单结束');
/* 写入订单结束 */ if(@tran_error < 1)
begin
/* 写入订单清单开始 */
declare @foodnumber int;
set @foodnumber=cast(ceiling(rand() * 5) as int); --生成[1-5]之间的随机数
print (N'需要写入 '+CONVERT(VARCHAR,@foodnumber)+N' 条订单清单');
while(@foodnumber>0)
begin
declare @fid int;
declare @funitprice int;
declare @fname nvarchar(12);
select top(1) @fid=[FID],@fname=[Name],@funitprice=[UnitPrice] from [dbo].[Food] where [BID]=@bid order by NEWID(); --随机抽取数据 declare @fcategoryname nvarchar(10);
select top(1) @fcategoryname=FC.[CategoryName] from
[dbo].[FoodCategoryRelation] as FCR
inner join [dbo].[FoodCategory] as FC on FC.[FCID]=FCR.[FCID]
where FCR.[FID]=@fid; INSERT INTO [dbo].[OrderBill] VALUES(@oid,@fid,@fname,@funitprice,@fcategoryname,1,GETDATE()); --插入订单清单
----- 执行语句
set @tran_error = @tran_error + @@error; --累积错误 set @totalprice=@totalprice + (@funitprice * 1);
print (N'写入一条订单清单完成,@foodnumber='+CONVERT(NVARCHAR,@foodnumber)+ N',@totalprice='+CONVERT(NVARCHAR,@totalprice)); set @foodnumber=@foodnumber-1;
end print (N'写入订单清单结束,@foodnumber='+CONVERT(NVARCHAR,@foodnumber)+ N',@totalprice='+CONVERT(NVARCHAR,@totalprice));
/* 写入订单清单结束 */ if(@totalprice>0)
begin
update [dbo].[Order] set [TotalPrice]=@totalprice,[PayPrice]=@totalprice,[PayMethod]=1,[PayTime]=null,[OrderStatus]=1 where [OID]=@oid;
----- 执行语句
set @tran_error = @tran_error + @@error; --累积错误 print (N'修改订单结束');
end end --判断要回滚或提交事物
if(@tran_error <> 0) --有误
begin
     print (N'回滚事务');
rollback transaction;
end
else
begin
     print (N'提交事务');
commit transaction;
set @num=@num-1;
end end
/* 生成订单结束 */ end END GO

SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等的更多相关文章

  1. SQL Server服务器上需要导入Excel数据的必要条件

    SQL Server服务器上需要导入Excel数据,必须安装2007 Office system 驱动程序:数据连接组件,或者Access2010的数据库引擎可再发行程序包,这样就不必在服务器上装Ex ...

  2. SQL Server ---(CDC)监控表数据(转译)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现过程(Realization) 补充说明(Addon) 参考文献(References) ...

  3. SQL Server使用convert对datetime日期数据进行获取

    来源:http://database.51cto.com/art/201007/211883.htm 备注:本文的语法讲解确实是比较乱,似乎格式不太严谨.参考时还是以实例验证为准比较好 以下的文章主要 ...

  4. 将Excel导入SQL Server 只能导入数字,其他数据变为NULL怎么解决?

    先新建一个TXT文件,把数据粘贴进去 再新建一个Excel文件,在菜单栏中选Data再选From Text 找到txt文件,点import 一定要选Text 点Finish,点OK. 接下来在往数据库 ...

  5. 转:SQL SERVER数据库中实现快速的数据提取和数据分页

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  6. SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪

    来源:http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html  本文主要介绍SQL Server中记录数据变更的四个方法:触发器 ...

  7. SQL Server 之 在数据库之间进行数据导入导出

    1.同一服务器上数据库之间进行数据导入导出 (1).使用 SELECT INTO 导出数据 在SQL Server中使用最广泛的就是通过SELECT INTO语句导出数据,SELECT INTO语句同 ...

  8. 学习如何看懂SQL Server执行计划(一)——数据查询篇

    一.数据查询部分 1. 看到执行计划有两种方式,对sql语句按Ctrl+L,或按Ctrl+M打开显示执行计划窗口每次执行sql都会显示出相应的执行计划 2. 执行计划的图表是从右向左看的 3. SQL ...

  9. SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...

随机推荐

  1. 记录我这一年的技术之路(nodejs纯干货)

    2015年12月28日23:19:54 更新koa应用.学习型网站和开发者工具等 coding伊始 开始认认真真的学习技术还是2015.10.21日开始的,记得很清楚,那天,是我在龙湖正式学习的第一天 ...

  2. JS的内建函数reduce

    @(js) reduce函数,是ECMAScript5规范中出现的数组方法.在平时的工作中,相信大家使用的场景并不多,一般而言,可以通过reduce方法实现的逻辑都可以通过forEach方法来变相的实 ...

  3. SQL Server常见问题介绍及快速解决建议

    前言 本文旨在帮助SQL Server数据库的使用人员了解常见的问题,及快速解决这些问题.这些问题是数据库的常规管理问题,对于很多对数据库没有深入了解的朋友提供一个大概的常见问题框架. 下面一些问题是 ...

  4. Web应用之LAMP源码环境部署

    一.LAMP环境的介绍 1.LAMP环境的重要性 思索许久,最终还是决定写一篇详细的LAMP的源码编译安装的实验文档,一来是为了给自己一个交代,把技术进行系统的归纳,将技术以极致的形式呈现出来,做为一 ...

  5. 技术笔记:XMPP之openfire+spark+smack

    在即时通信这个领域目前只找到一个XMPP协议,在其协议基础上还是有许多成熟的产品,而且是开源的.所以还是想在这个领域多多了解一下. XMPP协议:具体的概念我就不写了,毕竟这东西网上到处是.简单的说就 ...

  6. Lesson 19 Sold out

    Text 'The play may begin at any moment,' I said. 'It may have begun already,' Susan answered. I hurr ...

  7. ReactNative&weex&DeviceOne对比

    React Native出来有一段时间了,国内的weex和deviceone是近期发布的,我可以说从2011年就开始关注快速开发的跨平台平台技术了,接触过phoneGap.数字天堂.appcan等早期 ...

  8. 【JavaScript吉光片羽】--- 滑动条

    灯光的亮度控制需要一个滑动条,先借用lamp源码中Bar: var Bar = function (opt) { var defaults = { $id: "", // 进度条d ...

  9. 简单例子了解View的事件分发

    什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...

  10. Java中isAssignableFrom的用法

    class1.isAssignableFrom(class2) 判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口.如果是则返回 tru ...