樹形資料編號重排的通用儲存過程

2022-09-01 14:39:19 字數 2184 閱讀 6830

--重排編碼的儲存過程

create proc p_rtaxiscode

@tablename sysname,    --重排編碼的表名

@fieldname sysname,    --編碼欄位名

@coderule varchar(100)  --以逗號分隔的編碼規則,每層編碼的長度,比如1,2,3,表示有三層編碼,第一層長度為1,第二層長度為2,第三層長度為3

as--引數檢查

if isnull(objectproperty(object_id(@tablename),n'isusertable'),0)=0

begin

raiserror(n'"%s"不存在,或者不是使用者表',1,16,@tablename)

return

endif not exists(select * from syscolumns where id=object_id(@tablename) and name=@fieldname)

begin

raiserror(n'列名"%s"在使用者表"%s"中無效',1,16,@fieldname,@tablename)

return 

endif isnull(@coderule,'')=''

begin

raiserror(n'必須編碼規則字串',1,16)

return 

endif patindex(n'%[^0-9^,]%',@coderule)>0

begin

raiserror(n'編碼規則字串"%s"中只能包含數字和逗號(,)',1,16,@coderule)

return 

end--生成編碼重排處理語句

declare @s nvarchar(4000),@len int,@lens int

select

@tablename=quotename(@tablename),

@fieldname=quotename(@fieldname),

@len=left(@coderule,charindex(n',',@coderule+n',')-1),

@lens=@len,

@coderule=stuff(@coderule,1,charindex(n',',@coderule+n','),n'')+n',',

@s=n'right('+cast(power(10,@len) as varchar)

+n'+(select count(distinct '+@fieldname

+n') from '+@tablename

+n' where '+@fieldname+n'<=a.'+@fieldname

+n' and len('+@fieldname+n')='+cast(@len as varchar)

+n'),'+cast(@len as varchar)+n')'

while len(@coderule)>1

begin

select

@len=left(@coderule,charindex(n',',@coderule)-1),

@s=@s

+n'+case when len('+@fieldname

+n')>'+cast(@lens as varchar)

+n' then right('+cast(power(10,@len) as varchar)

+n'+(select count(distinct '+@fieldname

+n') from '+@tablename

+n' where '+@fieldname+n'<=a.'+@fieldname

+n' and '+@fieldname+n' like left(a.'+@fieldname

+n','+cast(@lens as varchar)

+n')+'''+replicate(n'_',@len)

+n'''),'+cast(@len as varchar)

+n') else '''' end',

@lens=@lens+@len,

@coderule=stuff(@coderule,1,charindex(n',',@coderule),n'')

endexec(n'update a set '+@fieldname+n'='+@s+n' from '+@tablename+n' a')

Postgres儲存樹形資料

碰到乙個樹形資料需要儲存再資料控制,碰到以下兩個問題 為了更加簡單一些,我們將使用一下資料 section a section a.1 section b section b.1 section b.1 section b.1.1當設計自引用表 有時候自己join自己 最簡單明瞭的就是有乙個pare...

樹形資料深度排序處理示例 模擬單編號法 sql

測試資料 declare t table id char 3 pid char 3 name nvarchar 10 insert t select 001 null 山東省 union all select 002 001 煙台市 union all select 004 002 招遠市 unio...

樹形資料的搜尋方法 javascript

假設有這樣的問題。給乙個如下資料結構的資料。然後求id 01001002的text值。var tree 這是個很明顯的多叉樹的樹形結構,一般情況下,對於這種樹形結構一般採用深度優先遍歷和廣度優先遍歷。深度優先遍歷的原則是 1.從頂點開始 2.如果當前節點有子節點,則遍歷當前節點的所有子節點 遞迴實現...