热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于SQLServer2005的学习笔记——CTE递归和模拟测试数据

在Oracle中模拟测试数据是非常简单的一件事情。Oracle首先提供了一个dual的虚表其次提供了一个Connectby语句,实现了虚表数据列的模拟最后Oracle提供了强大的DBMS_RANDO

Oracle中模拟测试数据是非常简单的一件事情。

Oracle首先提供了一个dual的虚表

其次提供了一个Connect by语句,实现了虚表数据列的模拟

最后Oracle提供了强大的DBMS_RANDOM包进行相关随机数的产生。

SELECT

 TRUNC(DBMS_RANDOM.VALUE(1,101)),

 DBMS_RANDOM.string('~',5),

 DBMS_RANDOM.string('l',5),

 DBMS_RANDOM.string('L',5),

 DBMS_RANDOM.string('a',5),

 DBMS_RANDOM.string('A',5),

 DBMS_RANDOM.string('u',5),

 DBMS_RANDOM.string('U',5),

 DBMS_RANDOM.string('x',5),

 DBMS_RANDOM.string('X',5),

 DBMS_RANDOM.string('p',5),

 DBMS_RANDOM.string('P',5)  

from

(

SELECT level,ROWNUM rn

 FROM DUAL

CONNECT BY ROWNUM<=1001

)

 

相比而言,SQLServer则没那么幸运了,首先没有虚拟的概念,则需要构建一个物理表以存储需要模拟的次数,再次需要使用CTE递归来模拟一个虚表数据,最后才通过相关随机函数进行构建数据。

--创建一个物理表,并插入要模拟的次数,最大不能超过32767

CREATE TABLE RandTable

(

 MaxNumber INT CHECK (MaxNumber >= 0 AND MaxNumber<=32767),

)

INSERT INTO RandTable values(32767);

--使用CTE递归构建列数据

WITH AutoSequence(MaxNumber,Identiy)

AS

(

SELECT e.MaxNumber,1 AS Identiy FROM RandTable AS e

UNION ALL

SELECT e.MaxNumber,Identiy+1 c FROM RandTable AS e,AutoSequence d

WHERE d.Identiy

)

--用时间+递增值做种子进行RAND

SELECT LEFT(NEWID(),4),

      RAND((DATEPART(mm,GETDATE())*100000)+(DATEPART(ss,GETDATE())*1000)+DATEPART(ms,GETDATE())),

      RAND(Identiy+(DATEPART(mm,GETDATE())*100000)+(DATEPART(ss,GETDATE())*1000)+DATEPART(ms,GETDATE())),

      CAST(RIGHT(CAST(RAND(Identiy+CAST(GETDATE() AS INT)) AS VARCHAR(100)),2) AS INT),

      CAST(RIGHT(CAST(RAND(Identiy+(DATEPART(mm,GETDATE())*100000)+(DATEPART(ss,GETDATE())*1000)+DATEPART(ms,GETDATE())) AS VARCHAR(100)),2) AS INT)

 FROM AutoSequence

OPTION (MAXRECURSION 32767);

SELECT LEFT(NEWID(),4),

      CAST(RIGHT(CAST(RAND(Identiy+CAST(GETDATE() AS INT)) AS VARCHAR(100)),2) AS INT)

 FROM AutoSequence

OPTION (MAXRECURSION 32767);

 

小结:

使用CTE递归和SQLServer随机函数还是存在很多问题的。

1、一定需要构建一种物理表

2CTE递归限制在032,767之间

3RAND产生的随机数比较集中,通过时间+递增值的方式来实现的话,只能截取后几位,导致无法控制随机值的区域。

4NEWID()产生的随机数为字符和数字混杂,也不能得到预期的效果

 

附,经测试不需要物理表也可

WITH RandTable(MaxNumber)
AS
(
SELECT 500 MaxNumber
),
AutoSequence(MaxNumber,Identiy)
AS
(
SELECT e.MaxNumber,1 AS Identiy FROM  RandTable AS e
UNION ALL
SELECT e.MaxNumber,Identiy+1 c FROM  RandTable AS e,AutoSequence d
WHERE d.Identiy)
SELECT LEFT(NEWID(),4),
RAND((DATEPART(mm,GETDATE())*100000)+(DATEPART(ss,GETDATE())*1000)+DATEPART(ms,GETDATE())),
RAND(Identiy+(DATEPART(mm,GETDATE())*100000)+(DATEPART(ss,GETDATE())*1000)+DATEPART(ms,GETDATE())),
CAST(RIGHT(CAST(RAND(Identiy+CAST(GETDATE() AS INT)) AS  VARCHAR(100)),2) AS INT),
CAST(RIGHT(CAST(RAND(Identiy+(DATEPART(mm,GETDATE())*100000)+(DATEPART(ss,GETDATE())*1000)+DATEPART(ms,GETDATE()))  AS VARCHAR(100)),2) AS INT)
FROM AutoSequence
OPTION (MAXRECURSION 32767);



推荐阅读
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了安全性要求高的真正密码随机数生成器的概念和原理。首先解释了统计学意义上的伪随机数和真随机数的区别,以及伪随机数在密码学安全中的应用。然后讨论了真随机数的定义和产生方法,并指出了实际情况下真随机数的不可预测性和复杂性。最后介绍了随机数生成器的概念和方法。 ... [详细]
author-avatar
这辈子没有你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有