日期:2014-05-18  浏览次数:20489 次

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

表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 paren