手机凤凰-凤凰彩票手机app-凤凰彩票下载
做最好的网站
您的位置:手机凤凰 > 凤凰彩票手机app数据库 > 如果生成1W个连续数字

如果生成1W个连续数字

2020-04-05 14:51

问题:

在数据库脚本开垦中,一时须要生成一批三番五次数字只怕日期,譬喻yearly report就需求三回九转数字做年份,比方daily report就要求生成必然时间约束内的天天日期。

而自带的类别表master..spt_values存在必然的局限性,只是从0到2047,也不可能一直生成三回九转日期。

大概大多数人会想到三个笨办法,通过while循环去各种插入数据到不常表,每一次数字加1大概日期加1天,但这么和数据库服务器的竞相就太频仍了。如若生成1W个三番若干次数字,那就要跟数据库服务器人机联作1W次,怕人!如若是有1000个客商端都必要调用那几个while循环,这就是1000W次!骇然!

寸草不留方案:

能够使用公用表表明式CTE通过递归格局落到实处,并编辑为多个通用表值函数方便调用,封装起来简化使用,重返表格式数据。

CTE是在内部存款和储蓄器中打算好数据,实际不是每一回一条往返服务器和客商端一遍。如若急需再插入到有时表的话正是整个数量一遍性插入。

只要传入参数为数字,则转移再三再四数字;假如传入参数为日期,则变化三番五次日期。是否以为很有利啊?

函数脚本:

if object_id('dbo.fun_ConcatStringsToTable') is not null drop function dbo.fun_ConcatStringsToTablego/* 功能:连续字符串以table形式返回 作者:zhang502219048 2018-12-10 脚本来源: -- 示例1: select * from dbo.fun_ConcatStringsToTable(1, 10000)-- 示例2: select * from dbo.fun_ConcatStringsToTable('1', '10000')-- 示例3: declare @dateBegin datetime = '2009-1-1', @dateEnd datetime = '2018-12-31' select * from dbo.fun_ConcatStringsToTable(@dateBegin, @dateEnd)-- 示例4: select * from dbo.fun_ConcatStringsToTable('2009-1-1', '2018-12-31')**/create function [dbo].[fun_ConcatStringsToTable]( @strBegin as nvarchar(100), @strEnd as nvarchar(100))returns @tempResult table (vid nvarchar(100))asbegin --数字 if isnumeric(@strBegin) = 1 and isnumeric(@strEnd) = 1 begin --使用CTE递归批量插入数字数据 ;with cte_table(id) as ( select cast(@strBegin as int) union all select id + 1 from cte_table where id  @strEnd ) insert into @tempResult select cast(id as nvarchar(100)) from cte_table option (maxrecursion 0) end --日期 else if isdate(@strBegin) = 1 and isdate(@strEnd) = 1 begin --使用CTE递归批量插入日期数据 ;with cte_table(CreatedDate) as ( select cast(@strBegin as datetime) union all select dateadd(day, 1, CreatedDate) from cte_table where CreatedDate  @strEnd ) insert into @tempResult select convert(varchar(10), CreatedDate, 120) from cte_table option (maxrecursion 0) end return;endgo

调用函数示例:

-- 示例1: select * from dbo.fun_ConcatStringsToTable(1, 10000)-- 示例2: select * from dbo.fun_ConcatStringsToTable('1', '10000')-- 示例3: declare @dateBegin datetime = '2009-1-1', @dateEnd datetime = '2018-12-31' select * from dbo.fun_ConcatStringsToTable(@dateBegin, @dateEnd)-- 示例4: select * from dbo.fun_ConcatStringsToTable('2009-1-1', '2018-12-31')

剧本运维结果:

结论:

从地点多少个图能够看看,通过轻巧调用fun_ConcatStringsToTable那么些自定义表值函数,钦点起止数字或日期,就完结了变动三番两次数字和日期的目标。

扩展:

假使想生成一而再一连月份吧?博主在这里间也帮大家写了一下本子,借使急需能够在这里根基上再自动做成表值函数:

with cte_table(CreatedDate) as( select cast('2017-12-1' as datetime) union all select dateadd(month, 1, CreatedDate) from cte_table where CreatedDate  '2018-04-01')select convert(varchar(7), CreatedDate, 120) as YearMonthfrom cte_tableoption (maxrecursion 0)

总结

上述所述是小编给大家介绍的sql server使用公用表表明式CTE通过递归方式编写通用函数自动生成再而三数字和日期 ,希望对我们有着扶助,假诺我们有此外疑问请给本身留言,小编会及时过来大家的。在那也特别多谢大家对台本之家网址的扶助!假设你以为本文对您有救助,接待转发,烦请表明出处,多谢!

本文由手机凤凰发布于凤凰彩票手机app数据库,转载请注明出处:如果生成1W个连续数字

关键词: