首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

SQL Server 中master..spt_values的应用

2023-11-09 来源:华佗小知识

今天在做数据分析报表的时候遇到一个这样的问题。

表结构如下。 部门编码、部门名称、部门人员ID(中间用逗号分割)

技术分享

我想通过和人员表链接,查询出一个新的数据集,查询出的结果集格式如下: 人员信息(ID或者姓名)、部门编码、部门名称

 

以前都是通过程序遍历拆分表字段组成新的集合字段,然后在结合SQL语句查询出结果集,但是这个报表要求只能通过SQL语句实现,以前记得可以通过写字段分割函数再结合游标实现。然而今天在网上无意间找到一个新的方法。用“master..spt_values”来实现,具体实现方法见下面实例1感觉这个东西太好用了。把网上的实例都整理了一下,希望各路大神批评指教,也希望大家继续把这方面的应用贴上.

 

按 Ctrl+C 复制代码按 Ctrl+C 复制代码

 

SQL Server 中master..spt_values的应用

标签:

小编还为您整理了以下内容,可能对您也有帮助:

请教大家一个关于Sql Server问题,在线等,谢谢。

可以借助master..spt_values来达到你的要求。

master..spt_values:其中类型P较为特殊,它只是0-2047(与版本有关)之间的数字的简单列表,作为对所有类型之间关系的预测。

语句如下:

DECLARE@SearchYear VARCHAR(4) --查询年份

DECLARE@YearFirstDay VARCHAR(10) --查询年份第一天

DECLARE@YearLastDay VARCHAR(10) --查询年份最后一天

SET @SearchYear = '2022'

SET @YearFirstDay = @SearchYear + '-01-01'

SET @YearLastDay = @SearchYear + '-12-31'

SELECT distinct CONVERT(NVARCHAR(10), DateAdd(MONTH,number,@YearFirstDay),120) AS GroupMouth

FROM master..spt_values a CROSS JOIN Employee b

WHERE a.type = 'P' AND a.number <= DateDiff(MONTH,@YearFirstDay,@YearLastDay)

AND @YearFirstDay BETWEEN b.BeginDate AND ISNULL(b.EndDate,'9999-12-31')

ORDER BY GroupMouth

当然前面的DECLARE定义和SET赋值完全可以转换成你前端处理,后端处理主要是Select一段的逻辑。

请教大家一个关于Sql Server问题,在线等,谢谢。

可以借助master..spt_values来达到你的要求。

master..spt_values:其中类型P较为特殊,它只是0-2047(与版本有关)之间的数字的简单列表,作为对所有类型之间关系的预测。

语句如下:

DECLARE@SearchYear VARCHAR(4) --查询年份

DECLARE@YearFirstDay VARCHAR(10) --查询年份第一天

DECLARE@YearLastDay VARCHAR(10) --查询年份最后一天

SET @SearchYear = '2022'

SET @YearFirstDay = @SearchYear + '-01-01'

SET @YearLastDay = @SearchYear + '-12-31'

SELECT distinct CONVERT(NVARCHAR(10), DateAdd(MONTH,number,@YearFirstDay),120) AS GroupMouth

FROM master..spt_values a CROSS JOIN Employee b

WHERE a.type = 'P' AND a.number <= DateDiff(MONTH,@YearFirstDay,@YearLastDay)

AND @YearFirstDay BETWEEN b.BeginDate AND ISNULL(b.EndDate,'9999-12-31')

ORDER BY GroupMouth

当然前面的DECLARE定义和SET赋值完全可以转换成你前端处理,后端处理主要是Select一段的逻辑。

数据库循环插入数值

数量多的话用insert select方法插入,如果只是纯数字的话,可以用系统表

insert into tb (a,b) select a.number,b.number from master..spt_values a,master..spt_values b

where a.type='p' and b.type='p' and a.number between 1 and 100 and b.number between 1 and 5

显示全文