今天在做数据分析报表的时候遇到一个这样的问题。
表结构如下。 部门编码、部门名称、部门人员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