循环插入以及存储过程方法
现在有两个表
表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
*/