在
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<e.MaxNumber AND
d.Identiy<500
)
|
--
用时间
+
递增值做种子进行
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
、一定需要构建一种物理表
2
、
CTE
递归限制在
0
到
32,767
之间
3
、
RAND
产生的随机数比较集中,通过时间
+
递增值的方式来实现的话,只能截取后几位,导致无法控制随机值的区域。
4
、
NEWID()
产生的随机数为字符和数字混杂,也不能得到预期的效果
附,经测试不需要物理表也可
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<e.MaxNumber AND d.Identiy<500
)
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);
分享到:
相关推荐
### SQL Server 2005 中使用 CTE ...在 SQL Server 2005 中,使用 CTE 实现递归是一种强大的技术,尤其适用于处理层级结构的数据。通过理解 CTE 的基本原理以及如何构造递归查询,可以有效地解决各种复杂的查询需求。
SQL Server中的递归查询主要通过CTE(公共表表达式)来实现,它是一种非常强大的工具,特别适用于处理层次结构数据。CTE是T-SQL脚本中的临时结果集,可以用于复杂的查询,尤其是需要递归操作的情况。本文将深入探讨...
《SQL Server 2005深入内幕——开发人员,最大的赢家》这本书主要探讨了SQL Server 2005的新特性和提升,对于开发人员来说,这些改进极大地提升了开发效率和性能。以下是书中提及的一些关键点: 1. **CLR集成**:...
本文主要介绍了 SQL Server 2005 中公用表表达式(CTE)的递归调用,用于解决树型结构数据的查询问题。CTE 是 SQL Server 2005 中的一种新的查询方式,它可以简化复杂的查询过程。 在本文中,我们使用一个树型结构...
在SQL Server 2008中实现递归查询来获取所有上级或下级数据是一项非常实用的技术,尤其是在处理具有层次结构的数据时。本篇将详细解释如何利用Common Table Expressions (CTE)来完成这样的查询,并对提供的示例代码...
SQL Server 2005对T-SQL进行了扩展,添加了新的语法元素和函数,如窗口函数(OVER子句)、公用表表达式(CTE)、递归查询以及WITH关键字。这些功能使得复杂的数据处理和分析变得更加高效。 2. **存储过程和触发器*...
SQL Server 2005 Beta 2带来了对Transact-SQL的显著增强,这些改进主要集中在提升查询表达能力、数据完整性(DRI)支持、性能优化以及错误处理方面。以下是对这些增强功能的详细说明: 1. **排序函数**: SQL ...
在SQL Server中,处理树状数据结构和层次结构时,递归公共表表达式(Recursive Common Table Expression,简称递归CTE)是一个强大的工具。它允许我们以有序的方式遍历和查询具有层级关系的数据,例如组织结构、产品...
SQL Server 2005 中的公用表表达式(CTE)是一种强大的工具,可以简化嵌套的 SQL 语句,提高代码的可维护性和性能。本文将介绍 CTE 的基本概念、语法和使用方法,并与传统的子查询和表变量相比,看看 CTE 是如何简化...
SQL Server 2005是微软公司推出的一款关系型数据库管理系统,它在IT行业中扮演着重要的角色,尤其在数据存储、管理和分析方面。SQL Server 2005引入了许多新特性和改进,使得数据库管理更加高效,同时也为开发人员...
在SQL Server 2005和2008中,处理树型结构的数据时,递归公共表表达式(Recursive Common Table Expression, CTE)是一种非常实用的技术。本篇文章将详细解析如何使用递归CTE查询树型结构,并通过一个Family Tree的...
在SQL Server中,公共表表达式(Common Table Expression,简称CTE)是一种非常有用的查询构造,它可以临时定义一个结果集,然后在这个结果集的基础上进行进一步的查询操作。CTE不仅可读性强,而且有助于简化复杂的...
SQL Server中的公用表表达式(CTE,Common Table Expression)是一种强大的工具,它允许你在复杂的查询中定义一个临时的结果集,这个结果集可以被查询本身多次引用。CTE的使用非常灵活,尤其在处理递归关系时表现得...
本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL查询、查询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们...
在SQL Server 2005中,T-SQL(Transact-SQL)是用于操作数据库的主要编程语言。...在SQL Server 2005中,CTE尤其是一个强大的特性,它提供了更灵活的方式来组织和重用查询结果,对于理解和优化查询性能至关重要。
在SQL Server 2008中,表达式递归查询是一种强大的工具,尤其适用于处理具有层级关系的数据,如组织结构、目录树或者分类系统。这种技术主要依赖于公用表表达式(Common Table Expression, CTE),它允许在单个查询...
2. **Transact-SQL (T-SQL)增强**:SQL Server 2005扩展了T-SQL语言,增加了新的函数、操作符和语句,如窗口函数、公用表表达式(CTE)和嵌套触发器,提高了开发人员编写复杂查询的灵活性。 3. **Integration ...