数据库表字段数据切割问题

有的时候为了降低存储记录数,可能会把多条记录合并为一条显示。

这样的情况的发生主要体现上记录在表的其他字段都同样,仅仅有某一个字段是变化的这样的情况。比如人事管理中,部门中的相关人的ID都放在一条记录的一个字段中,中间用逗号隔开。如今的需求就是要将一条记录按ID字段切割成多条记录。

CREATE TABLE [dbo].[Table_Dept](
	[DEPT_CODE] [int] NULL,
	[content] [nvarchar](50) NULL,
	[A0188s] [nvarchar](max) NULL
) ON [PRIMARY]

GO

insert into Table_Dept select 1000,'总务系','350,688,258' union all select 1001,'总经理室','2,3,4,298'


查询该表结果例如以下。当中DEPT_CODE部门编码。content是部门名称,A0188s是相关人。

如今须要将A0188s中的ID分解为多条显示。考虑採用自己定义字符串切割函数实现,切割函数脚本:

CREATE   FUNCTION [dbo].[Split]   
(   
@c VARCHAR(MAX) ,   
@split VARCHAR(50)   
)   
RETURNS @t TABLE ( col VARCHAR(50) )   
AS  
BEGIN  
    WHILE ( CHARINDEX(@split, @c) <> 0 )   
        BEGIN  
            INSERT  @t( col )   
            VALUES  ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1) )   
            SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')   
        END  
    INSERT  @t( col ) VALUES  ( @c )   
    RETURN  
END
可是该函数仅仅能处理单条记录,这里考虑採用游标遍历原表,逐个分解然后存储到暂时表中。

IF object_id('tempdb..#TEMPTB1') is not null
BEGIN
	drop table #TEMPTB1
END
CREATE table #TEMPTB1
(
    [DEPT_CODE] [int] NULL,
    [content] [nvarchar](50) NULL,
    [A0188s] [nvarchar](max) NULL
)

IF object_id('tempdb..#TEMPTB2') is not null
BEGIN
	drop table #TEMPTB2
END
CREATE table #TEMPTB2
(
    [pid] [nvarchar](max) NULL
)

declare @DEPT_CODE int
declare @content varchar(50)
declare @A0188s varchar(max)
exec('declare my_cursor1 cursor for select * from [Table_Dept]')
open my_cursor1
declare @id1 sysname
declare @id2 sysname
declare @id3 sysname
fetch next from my_cursor1 into @id1,@id2,@id3
	while(@@fetch_status= 0)
		begin	
			set @DEPT_CODE =convert(int,@id1)
			set @content =convert(varchar(50),@id2)
			set @A0188s =convert(varchar(max),@id3)
			truncate table #TEMPTB2
		     insert into #TEMPTB2 select * from Split(@A0188s,',')
		     insert into #TEMPTB1 select @DEPT_CODE,@content,pid from #TEMPTB2
			fetch next from my_cursor1 into @id1,@id2,@id3
		end
close my_cursor1
deallocate my_cursor1

select * from #TEMPTB1

得到终于结果




转载于:https://www.cnblogs.com/ljbguanli/p/6738780.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值