【SQL】分享表值函数FMakeRows,用于生成行
------------更新:201501071730------------
评论中又有一位【笑东风】兄给出改善建议,在此先感谢他。原理是借助行数较多的一个系统视图sys.all_columns与自身做cross join,以得到大量现成行数,详情请见回复。在我的原文中我也提到考虑过这种借助现有系统对象得到行的方法,但我想当然认为这样会导致访问基础表,性能不会好,所以试都没试就pass了,但事实证明我错了,他的法子经测性能比倍增法好太多,再次自我教训,实践才是硬道理!!!再次感谢【笑东风】兄。最终实现如下:
/*----------------------
函数:生成行 0.01
Author:AhDung
Update:201412310925
----------------------*/
CREATE FUNCTION dbo.FMakeRows(@num INT)
RETURNS TABLE
RETURN (
SELECT TOP (CASE WHEN @num IS NULL OR @num<0 THEN 0 ELSE @num END) ROW_NUMBER() OVER(ORDER BY a.object_id) AS 'RowNo'
FROM sys.all_columns a CROSS JOIN sys.all_columns b
)
------------更新:201501061241------------
评论中有朋友提到不如用with,我理解他说的是CTE递归,在此先感谢一下这位【空紫竹】兄提出建议。遂试了下用CTE实现,代码如下:
CREATE FUNCTION dbo.FMakeRows2(@num INT)
RETURNS TABLE
RETURN (
WITH cte AS (
SELECT 1 AS 'RowNo',1 AS 'Lv'
UNION ALL
SELECT RowNo+Lv,Lv*2 FROM cte WHERE RowNo+Lv<=@num
UNION ALL
SELECT RowNo+Lv*2,Lv*2 FROM cte WHERE RowNo+Lv*2<=@num
)
SELECT RowNo FROM cte
)
功能一样,原理是递归倍增,语句变少了,但性能比不上原文的方法,16384行上述方法要400ms左右,与逐行法差不多,而原文方法只要140ms,所以算不上好方法,权当学习一下CTE递归知识。如果我的实现有问题,还望路过大侠指点,谢谢。
------------原文:201412311300------------
作用:传入整数x,返回一张x行的表,只有一列RowNo,存储各行序号。
对于这个需求,我先是找有没有现成的函数或过程,结果是没找到,如果路过的朋友知道,还望告知,谢谢。
使用示例:

至于该函数具体可以应用到哪些场景,只可意会,需要的人自然觉得有用,觉得没用的说明不需要。上代码:
/*----------------------
函数:生成行 0.01
Author:AhDung
Update:201412310925
----------------------*/
ALTER FUNCTION dbo.FMakeRows(@num INT)
RETURNS @t TABLE (RowNo INT)
BEGIN IF @num IS NULL OR @num <= 0 RETURN INSERT @t VALUES(1) DECLARE @no INT = 1
WHILE @no*2 <= @num
BEGIN
INSERT @t SELECT RowNo+@no FROM @t
SET @no *= 2
END INSERT @t SELECT TOP (@num-@no) RowNo+@no FROM @t RETURN
END
实现说明:原理是先给@t塞一个初始行,完了循环insert自身,如此1变2、2变4、4变万物……,每一圈后@t的行数都是上一圈的2倍,直到行数x2大于所需行数(@num)前打住,即要把行数控制在小于等于@num的范围内,最后从现有行中抽取一部分补齐所差的行。例如,需要的行数是13,转到3圈后,@t有8行,就要打住了,因为再转就成16行了,8距离13所差的5行最后通过从@t中抽取top 5补齐。
实现该函数一开始想到的是根据@num循环,每圈插一行,需要几行就转几圈(逐行法),逻辑很简单,但这样做很老实,事实证明效率也不如上述方法(行数倍增),两种方法经测试到500行时就有明显差异了,到16384行时,倍增法在140ms左右,逐行法400ms左右,我想原因就是倍增法大大减少了循环圈数,16384行只需转14圈,而逐行法要老老实实转足16384圈呐~怕怕。
也想过从某个必定存在的系统表/视图获取行,如sys.objects,但这样会访问基础表,即使你根本不select它的任何字段,这样性能必然不如纯内存操作来的好,试都不用试。再说也不地道,作为函数,依赖越少越健壮。
路过朋友如有更好方法,还请不吝赐教,非常感谢。
【SQL】分享表值函数FMakeRows,用于生成行的更多相关文章
- SQL Server 表值函数
表值函数还是很有意思的,我现在想实现一个功能.就是我查询出来的内容,我要对结果进行再次查询,也要输入参数,我想了想 1.存储过程 不能对执行后的结果进行再次查询,需要创建临时表,太麻烦 2.视图 ...
- 【SQL】sql版Split函数。用于拆分字符串为单列表格
功能与.net版string.Split函数类似,只不过.net返回的是数组,这个返回的是一个单列表格,每个拆分出来的子串占一行.可选是否移除空格子串和重复项.市面上类似的函数不算少,但大多都是在循环 ...
- PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)
将字符串分割为表表经常用到,这里 SQL表值函数与CLR 表值函数,两种实现方法例出来如下: SELECT * FROM FP_EMSDB_PUB.dbo.SqlSplit('/','1oz/1.5 ...
- T-SQL编程 —— 用户自定义函数(内嵌表值函数)
内嵌表值函数 接上 <T-SQL编程 -- 用户自定义函数(标量函数)> http://www.cnblogs.com/viusuangio/p/6212072.html 内嵌表值函数可以 ...
- sql 表值函数与标量值函数
写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的,区别是表值函数只能返回一个表,标量 ...
- SQL Server中使用表值函数
函数有很多限制,不能使用动态语句,不能使用临时表等等...细看一下,直接写语句就行了,不用动态语句 insert into @re select id,parid,@I from videoclass ...
- sql server 中的表值函数和标量值函数
顾名思义:表值函数返回的是表,而标量值函数可以返回基类型 一.表值函数 用户定义表值函数返回 table 数据类型.对于内联表值函数,没有函数主体:表是单个 SELECT 语句的结果集. 以下示例 ...
- SQL Server进阶(六)表表达式--派生表、公用表表达式(CTE)、视图和内联表值函数
概述 表表达式是一种命名的查询表达式,代表一个有效地关系表.可以像其他表一样,在数据处理中使用表表达式. SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 为什么 ...
- PCB MS SQL 标量函数与表值函数(CLR) 实现文件与目录操作
一.C#写SQL SERVER(CLR)实现文件操作 标量函数: 文件移动 ,复制,检测文件存在,写入新文件文本,读取文本,创建目录,删除目录,检测目录是否存在 /// <summary> ...
随机推荐
- 安装金山WPS2013造成的HTML5 file.type值异常
处理代码的兼容性是前端攻城师们的家常便饭了,一般是对各种浏览器进行兼容性处理.但是有时候我们也会遭遇到浏览器以外的影响因素,这个是经常会被忽视掉的内容.比如前几天就听说客户端安装迅雷.暴风影音等软件会 ...
- Linux下Java开发环境搭建—CentOS下Mysql安装教程
本人学习Linux时使用的是CentOs5.5版本,在该环境中,Mysql的安装方法有很多种,下面我只讲我这次成功了的方法,作为一个记录,供大家参考,同时给自己做一个笔记. MySQL下载 1.进入网 ...
- AWS助理架构师样题解析
AWS 认证是对其在 AWS 平台上设计.部署和管理应用程序所需的技能和技术知识的一种认可.获得证书有助于证明您使用 AWS 的丰富经验和可信度,同时还能提升您所在的组织熟练使用基于 AWS 云服务应 ...
- 我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception
回到目录 说在前 本节主要说一下Unity家族里的拦截组件,对于方法拦截有很多组件提供,基本上每个Ioc组件都有对它的实现,如autofac,它主要用在orchard项目里,而castle也有以拦截的 ...
- Nodejs·网络服务
本章是从NodeJS拥有的模块角度,讲述了网络服务中的应用: net ----- > TCP dgram --> UDP http -----> HTTP https ----> ...
- Atitit 图像金字塔原理与概率 attilax的理解总结qb23
Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔 ( Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...
- atitit 短信接口规范与短信解决方案.docx
atitit 短信接口规范与短信解决方案.docx 1.1. 国内比较著名的短信提供商1 1.2. 短信接口规范1 1.3. 短信sdk构成1 1.4. 短信的实现1 1.5. SmsServiceY ...
- iOS-网络爬虫
1.iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据 2.iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据 3.iOS—网络实用技术OC篇&am ...
- Android笔记——活动的生命周期
一.活动的重要性 掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的游刃有余.你的应 ...
- 学习ASP.NET MVC(七)——我的第一个ASP.NET MVC 查询页面
在本篇文章中,我将添加一个新的查询页面(SearchIndex),可以按书籍的种类或名称来进行查询.这个新页面的网址是http://localhost:36878/Book/ SearchIndex. ...