MSSQL存储过程也玩“递归”

真是林子大了,什么鸟都有。客户的需求也是千变万化。
前阵子就因为一个客户的要求,需要把原本手工填写的东西改成自动生成,因为他们填的信息不符合标准。(ps:看来不应该要求客户输入太多的东西,尽可能做到客户少敲点键盘)

我们系统有一个表如下:

None.gif create   table  department(
None.gif    departid 
int   identity ( 1 , 1 primary   key -- 部门标识
None.gif
    departnumber  nvarchar ( 20 not   null ,         -- 部门编码
None.gif
    departname  nvarchar ( 50 not   null ,         -- 部门名称
None.gif
    parentdepart  nvarchar ( 50 )                 -- 上级部门
None.gif
)

其中 parentdepart 根据 departid 生成,顶级为空例如
departid    parentdepart
1              
2              1_
3              1_
4              1_3_
5              1_2_
6              1_2_5_
...             ....
基本的关系相信大家应该很清楚了,系统默认departnumber是客户自己输入的,所以各种各样的数据都有,后来数据太多了,有很多地方不便或出错。我们不得不给他们改成诸如下面的格式:

01
0101
02
0201
020101
020102
...
然后让程序自动生成,这时候麻烦来了,数据库中已经有几百条数据了,总不成一个一个手工给他们改吧。最开始想到写一个页面,搞一点简单的代码然后运行一下就全部OK了。
但后来在很多项目都发现这种现象,难道又写一点代码呀?看来得想个一劳永逸的方法才行。
......
经过摸过,终于用存储过程递归搞定。
下面是相应的存储过程,其中用到了游标等.(有很多人可能不喜欢用游标)

None.gif -- 根据相应关系更新编号
None.gif
create   procedure  sp_UpdateNumber(
None.gif    
@ParentNumber   nvarchar ( 100 ) = '' ,         -- 上级编号
None.gif
     @ParentRelation   nvarchar ( 1000 ) = '' ,     -- 和上级的关系
None.gif
     @NumberField   nvarchar ( 20 ),             -- 编号字段
None.gif
     @RelationField   nvarchar ( 20 ),         -- 层次关系字段
None.gif
     @FieldName   nvarchar ( 20 ),             -- 生成层次关系字段
None.gif
     @TableName   nvarchar ( 20 )                 -- 表名称
None.gif
)
None.gif
as
None.gif    
declare   @sqlstr   nvarchar ( 4000 )
None.gif    
None.gif    
set   @sqlstr = '
None.gif        declare @count int
None.gif        set @count=1
None.gif    
None.gif        declare @coding nvarchar(100)
None.gif    
None.gif        declare cur_0
' + @ParentNumber + '  cursor for select  ' + @FieldName + '  from  ' + @TableName + '  where  ' + @RelationField + ' =@ParentRelation
None.gif        open cur_0
' + @ParentNumber + '
None.gif    
None.gif        declare @number int
None.gif        declare @relation nvarchar(200)
None.gif    
None.gif        fetch next from cur_0
' + @ParentNumber + '  into @number
None.gif        while @@fetch_status=0
None.gif            begin
None.gif                set @coding=@ParentNumber+replicate(
'' 0 '' ,2-len(@count))+convert(nvarchar,@count)
None.gif                update 
' + @TableName + '  set  ' + @NumberField + ' =@coding where  ' + @FieldName + ' =@number
None.gif                
None.gif                set @relation=@ParentRelation+convert(nvarchar,@number)+
'' _ ''
None.gif    
None.gif                exec sp_UpdateNumber @coding,@relation,@NumberField,@RelationField,@FieldName,@TableName
None.gif    
None.gif                set @count=@count+1
None.gif                
None.gif                fetch next from cur_0
' + @ParentNumber + '  into @number
None.gif            end
None.gif    
None.gif        close cur_0
' + @ParentNumber + '
None.gif        deallocate cur_0
' + @ParentNumber + '
None.gif    
'
None.gif
None.gif    
exec  sp_executesql  @sqlstr ,
None.gif        N
' @ParentNumber nvarchar(100),@ParentRelation nvarchar(1000),@NumberField nvarchar(20),@RelationField nvarchar(20),@FieldName nvarchar(20),@TableName nvarchar(20) ' ,
None.gif        
@ParentNumber , @ParentRelation , @NumberField , @RelationField , @FieldName , @TableName
None.gif
None.gif
GO
None.gif

调用示例:
None.gif exec  sp_UpdateNumber  '' , '' , ' departnumber ' , ' parentdepart ' , ' departid ' , ' department '

转载于:https://www.cnblogs.com/lyout/archive/2007/05/17/750274.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值