当前位置: 代码迷 >> Sql Server >> SQL有关问题,求大神指教
  详细解决方案

SQL有关问题,求大神指教

热度:69   发布时间:2016-04-24 08:47:50.0
SQL问题,求大神指教
有ABC三列,现在想要自动生成,第三列,如何可以自动生成。
表名:DEPT
编码(code)     名称(content)             全称(FCONTENT)
1                                XX公司                     XX公司
101                            A部门                      XX公司/A部门
10101                         甲组                       XX公司/A部门/甲组
102                B部门                      XX公司/B部门
10201                          甲组                       XX公司/B部门/甲组
1020101                     一班                        XX公司/B部门/甲组/一班


当我在这个DEPT表中插入编码和名称时,自动全称,求这个存储过程,如何写?
------解决思路----------------------
--更新语句
;WITH CTE AS(
SELECT code,content,CAST(content AS VARCHAR(8000))FCONTENT
FROM DEPT
WHERE LEN(code)<3
UNION ALL
SELECT T1.code,T1.content,T2.FCONTENT+'/'+T1.content
FROM DEPT T1
JOIN CTE T2 ON LEFT(T1.code,LEN(T2.code))=T2.code AND LEN(T1.code)=LEN(T2.code)+2
)
UPDATE T1
SET FCONTENT=T2.FCONTENT
FROM DEPT T1
JOIN CTE T2 ON T1.code=T2.code

--查看结果
SELECT * FROM DEPT

------解决思路----------------------

create table DEPT
(code varchar(20),content varchar(20),FCONTENT varchar(50))

insert into DEPT(code,content)
 select '1','XX公司' union all
 select '101','A部门' union all
 select '10101','甲组' union all
 select '102','B部门' union all
 select '10201','甲组' union all
 select '1020101','一班'


-- 创建函数
create function dbo.fn_AutoGenFCONTENT
(@x varchar(20))
returns varchar(50)
as
begin
 declare @y varchar(50)

 while(len(@x)>0)
 begin
   select @y=content+isnull('/'+@y,'') 
    from DEPT 
    where code=@x
   
   select @x=left(@x,case when len(@x)-2<0 then 0 else len(@x)-2 end)  
 end

 return @y
end


-- 更新
update DEPT 
 set FCONTENT=dbo.fn_AutoGenFCONTENT(code)


-- 结果
select * from DEPT
/*
code                 content              FCONTENT
-------------------- -------------------- ----------------------------
1                    XX公司                 XX公司
101                  A部门                  XX公司/A部门
10101                甲组                   XX公司/A部门/甲组
102                  B部门                  XX公司/B部门
10201                甲组                   XX公司/B部门/甲组
1020101              一班                   XX公司/B部门/甲组/一班

(6 row(s) affected)
*/

------解决思路----------------------
insert触发器,inserted表里使用update
  相关解决方案