调整编码的隶属关系2,在线等答案

ynshwsx 2009-06-14 11:58:00
if object_id('hzfa') is not null drop table hzfa
create table hzfa(id int identity,bh varchar(100))
insert hzfa(bh)
select '01'
union all select '0101'
union all select '01017710'
union all select '02'
union all select '0202'
union all select '02020020'
union all select '03'
union all select '0303'
union all select '03030030'



declare
@tablename sysname,
@fieldname sysname,
@CodeRule varchar(50),
@code varchar(50) ---要删除的节点编码
select @tablename='hzfa',@fieldname='bh',@CodeRule='1,2,3',@code='01'
--生成被删除节点的子节点的新编码规则(因为子节点要提升一级)
declare @codelen int,
@codelens int,
@CodeRule_new varchar(50)
select @codelens=len(@code),
@CodeRule_new=@CodeRule+','
--获取被删除的编码的最后一级的长度,并生成该编码之后编码规则
while @CodeRule_new>'' and @codelens>0
begin
select @codelen=LEFT(@CodeRule_new,charindex(',',@CodeRule_new)-1),
@CodeRule_new=STUFF(@CodeRule_new,1,charindex(',',@CodeRule_new),''),
@codelens=@codelens-@codelen
end
print @codelen 2
print @CodeRule_new 3,
print @codelens -1
--确认要删除的编码是否符合编码规则
if @codelens<>0
begin
raiserror(N'编码不符合指定的编码规则"%s"',16,1,@code,@CodeRule)
return
end
print @CodeRule_new




编码规则1,2,3删除表中01的编码,子编码上升一级,问题是以上代码判断@CODELENS <>0显示错误,执行以上语句之后,@CODELENS不可能为0,请高手指点,在线等
...全文
15 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
claro 2009-06-15
  • 打赏
  • 举报
回复
学习。
ynshwsx 2009-06-15
  • 打赏
  • 举报
回复
怎么没人回签
soft_wsx 2009-06-14
  • 打赏
  • 举报
回复
楼主可以按照我的方法一步步试试看
declare
@tablename sysname,
@fieldname sysname,
@CodeRule varchar(50),
@code varchar(50) ---要删除的节点编码
select @tablename='hzfa',@fieldname='bh',@CodeRule='2,3,4',@code='01001'
--生成被删除节点的子节点的新编码规则(因为子节点要提升一级)
declare @codelen int,
@codelens int,
@CodeRule_new varchar(50)
select @codelens=len(@code),
@CodeRule_new=@CodeRule+','
--获取被删除的编码的最后一级的长度,并生成该编码之后编码规则
while @CodeRule_new>'' and @codelens>0
begin
select @codelen=LEFT(@CodeRule_new,charindex(',',@CodeRule_new)-1),
@CodeRule_new=STUFF(@CodeRule_new,1,charindex(',',@CodeRule_new),''),
@codelens=@codelens-@codelen
end
print @codelen
print @CodeRule_new
print @codelens
--确认要删除的编码是否符合编码规则
if @codelens<>0
begin
raiserror(N'编码不符合指定的编码规则"%s"',16,1,@code,@CodeRule)
return
end

--生成修改被删除节点子节点编码的新编码规则
set @CodeRule_new=case when @CodeRule_new='' then @CodeRule_new
else STUFF(@CodeRule,2+len(@CodeRule)-charindex(',',reverse(@CodeRule)+',',len(@CodeRule_new)+2),0,'0,')
end
print @CodeRule_new

--得到被删除节点子节点编码更新和T-sql
declare @sql nvarchar(4000)
set @sql=dbo.f_changecoderule(@coderule,@CodeRule_new,'',-1,@fieldname)

print @sql
--检查并完成删除处理
declare @value_code varchar(50),
@value_code_child varchar(50)
select @value_code=QUOTENAME(@code,N''''),
@value_code_child=QUOTENAME(@code+N'_%',N'''')
print @value_code
print @value_code_child

select no_old=bh,
no_new= case
when len(bh)<1 then ''
else substring(bh,1,2)
end
+case
when len(bh)<6 then ''
else left(substring(bh,6,4),3)
end
into #
from hzfa with(xlock,tablock)
where bh like '01001_%'

delete from hzfa
where bh='01001'


update a set bh=b.no_new
from hzfa a,# b
where a.bh=b.no_old



select * from hzfa


--结果
1 01
3 01100
4 01200
5 01300
6 02
7 02002
8 020020002
9 03
10 03003
11 030030003
soft_wsx 2009-06-14
  • 打赏
  • 举报
回复
楼主错了
比如说编码规则是2,2,3
有如下数据
要删除二级001,应该为01001,不信可以自己看看
if object_id('hzfa') is not null drop table hzfa
create table hzfa(id int identity,bh varchar(100))
insert hzfa(bh)
select '01'
union all select '01001'
union all select '010010001'
union all select '02'
union all select '02002'
union all select '020020002'
union all select '03'
union all select '03003'
union all select '030030003'
-晴天 2009-06-14
  • 打赏
  • 举报
回复
把while先注释掉,看只循环一次的结果与你想要的结果是否相同.
needanothercoder 2009-06-14
  • 打赏
  • 举报
回复
ding
ai_li7758521 2009-06-14
  • 打赏
  • 举报
回复
路过

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧