首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

循环插入以及存储过程方法解决方案

2012-02-02 
循环插入以及存储过程方法现在有两个表表tempidcaptionparentId1aa1.12bb1.1.13cc1.1.24dd1.1.2.15ee1.1.2

循环插入以及存储过程方法
现在有两个表

表temp  
id     caption       parentId
1           aa                   1.1
2           bb                   1.1.1
3           cc                     1.1.2
4           dd                   1.1.2.1
5           ee                   1.1.2.1
6           ff                       1.1.3

表work
id       sortId       caption     parentId


现在条件是知道1.1.2,需要把表temp中的   3,4,5三条记录插入到work中,要求
查看work中是否有id=1.1.2这条记录,没有要加进去,然后生成这三条记录。结果如下:

表work
id                   sortId       caption     parentId
1.1.2                   0                                               NULL
1.1.2.1             0                   cc                       1.1.2
1.1.2.1.1       0                   dd                     1.1.2.1
1.1.2.1.2       1                   ee                     1.1.2.1


其中id是要根据其父id去生成,比如,其父id=1.1,那就查询以1.1为父的现在的最大的id和序号,
然后把加一得到现在的id,.


这种用存储过程要怎么实现呢?是不是用游标再加上function来实现呢?会的人指教下。
循环插入   (parentId   like   1.1.2.%   or   parentId   =1.1.2)查询出来的数据要如何写,生成ID是不是应该写个方法单独处理,一个方法可以返回两个值吗?同时返回ID和SORTID,这样是否可以?

[解决办法]
insert work
select
id =a.parentId+ '. '+cast((select count(*) from tmp where parentId=a.parentId and id <= a.id) as varchar),
sortId =(select count(*) from tmp where parentId=a.parentId and id <= a.id)-1,
caption ,
parentId
from temp a
where parentId like '1.1.2% '
union all
select
id = '1.1.2 ',
sortId =0,
caption = ' ',
parentId =null

[解决办法]
CREATE TABLE #tmp ([id] int IDENTITY(1,1),caption nvarchar(20),parentId nvarchar(50) )
INSERT INTO #tmp
SELECT 'aa ' , '1.1 ' UNION ALL
SELECT 'bb ' , '1.1.1 ' UNION ALL
SELECT 'cc ' , '1.1.2 ' UNION ALL
SELECT 'dd ' , '1.1.2.1 ' UNION ALL
SELECT 'ee ' , '1.1.2.1 ' UNION ALL
SELECT 'ff ' , '1.1.3 '
CREATE TABLE #work ([id] nvarchar(50),sortid bit,caption nvarchar(20),parentId nvarchar(50) )

--根据所得的条件插入表#work
DECLARE @id nvarchar(50)
SET @id= '1.1.2 '
INSERT INTO #work
SELECT @id,0,NULL,NULL UNION ALL
SELECT parentId,0,caption,parentId FROM #Tmp WHERE parentId like @id+ '% '


--修改ID
DECLARE @i int
UPDATE #work SET @i=CASE WHEN [id]=LEFT(@id,LEN(@id)-2) THEN @i+1 ELSE 1 END
,@id=CASE WHEN [id]=LEFT(@id,LEN(@id)-2) THEN [id]+ '. '+CAST(@i as nvarchar(2)) ELSE [id]+ '.1 ' END
,[id]=@id
WHERE caption IS NOT NULL
SELECT * FROM #work
DROP TABLE #tmp,#work

/*
表work
id sortId caption parentId
1.1.2 0 NULL
1.1.2.1 0 cc 1.1.2
1.1.2.1.1 0 dd 1.1.2.1
1.1.2.1.2 1 ee 1.1.2.1
*/

热点排行