数据库表字段数据切割问题
有的时候为了降低存储记录数,可能会把多条记录合并为一条显示。
这样的情况的发生主要体现上记录在表的其他字段都同样,仅仅有某一个字段是变化的这样的情况。比如人事管理中,部门中的相关人的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
得到终于结果