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

我们系统有一个表如下:

MSSQL存储过程也玩“递归”create table department(
MSSQL存储过程也玩“递归”    departid 
int identity(1,1primary key--部门标识
MSSQL存储过程也玩“递归”
    departnumber nvarchar(20not null,        --部门编码
MSSQL存储过程也玩“递归”
    departname nvarchar(50not null,        --部门名称
MSSQL存储过程也玩“递归”
    parentdepart nvarchar(50)                --上级部门
MSSQL存储过程也玩“递归”
)

其中 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了。
但后来在很多项目都发现这种现象,难道又写一点代码呀?看来得想个一劳永逸的方法才行。
......
经过摸过,终于用存储过程递归搞定。
下面是相应的存储过程,其中用到了游标等.(有很多人可能不喜欢用游标)

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

调用示例:
MSSQL存储过程也玩“递归”exec sp_UpdateNumber '','','departnumber','parentdepart','departid','department'

相关文章:

  • 2022-12-23
  • 2021-12-14
  • 2021-08-21
  • 2021-09-19
  • 2021-10-10
  • 2022-03-03
  • 2021-10-20
  • 2022-12-23
猜你喜欢
  • 2022-01-27
  • 2021-08-02
  • 2022-12-23
  • 2021-12-01
  • 2021-10-09
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案