在查询分析器中执行: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. html5 与视频

    1.视频支持格式. 有3种视频格式被浏览器广泛支持:.ogg,.mp4,.webm. Theora+Vorbis=.ogg  (Theora:视频编码器,Vorbis:音频编码器) H.264+$$$ ...

  2. ASP.NET中常用的优化性能的方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...

  3. 基于window7+caffe实现图像艺术风格转换style-transfer

    这个是在去年微博里面非常流行的,在git_hub上的代码是https://github.com/fzliu/style-transfer 比如这是梵高的画 这是你自己的照片 然后你想生成这样 怎么实现 ...

  4. C# salt+hash 加密

    一.先明确几个基本概念 1.伪随机数:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的算法来产生的.伪随机数并不是假随机 数,这里的" ...

  5. EC笔记:第4部分:20、传递引用代替传值

    考虑以下场景: #include <iostream> #include <string> using namespace std; struct Person { strin ...

  6. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  7. iOS开发 适配iOS10

    2016年9月7日,苹果发布iOS 10.2016年9月14日,全新的操作系统iOS 10将正式上线. 作为开发者,如何适配iOS10呢? 1.Notification(通知) 自从Notificat ...

  8. maven的pom.xml关系依赖书写顺序

    今天遇到了一个情况,以前代码编译没有问题,升级了hbase客户端phoenix驱动,又调整了thrift的关系依赖的位置,放到了这个驱动后面. 如下: 导致了一个thrift接口类编译报错: 检查这个 ...

  9. No plugin found for prefix ‘jetty’ in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories

    maven配置文件(最大的那个)的<pluginGroups></pluginGroups>增加一行如下<pluginGroups><pluginGroup& ...

  10. ABP理论之时间

    返回总目录 本篇目录 介绍 Clock 时区 绑定器和转换器 介绍 虽然有些应用针对的是一个特定的时区,但是也有一些应用针对多个不同的时区.为了满足这些需求,ABP为datetime操作提供了通用的基 ...