sql游标的问题

ufgovfucw 2010-09-22 12:08:17
现在有一张表如下:
kmdm kmmx
101 1
102 0
10201 1
10202 1
10203 1
103 0
...
里面的关系是这样的,kmdm字段值,如果不带下级明细的kmmx字段值为1如果带有下级明细的kmmx字段值为0。
里面有错误,比如103不带下级明细值应该为1,我要逐一找出这样的记录并修改它的kmmx值为正确的值,我写了下面的sql语


怎么得出的结果是这样的呢:
kmdm kmmx
101 1
102 1
10201 1
10202 1
10203 1
103 1
...
结果kmmx字段值全变成了1.请大侠救我。

declare @kmdm varchar(16),@i int
declare xfkmmx cursor for select kmdm from gl_kmxx where gsdm='' for update
open xfkmmx
fetch next from xfkmmx into @kmdm
while(@@fetch_status<>-1)
begin
select @i=count(kmdm) from gl_kmxx where gsdm='' and kmdm like @kmdm
if @i>1
begin
update gl_kmxx set kmmx='0' where current of xfkmmx
end
else
begin
update gl_kmxx set kmmx='1' where current of xfkmmx
end
fetch next from xfkmmx into @kmdm
end
close xfkmmx
deallocate xfkmmx
...全文
32 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dawugui 2010-09-22
create table tb(kmdm varchar(10),kmmx int)
insert into tb values('101' ,null)
insert into tb values('102' ,null)
insert into tb values('10201' ,null)
insert into tb values('10202' ,null)
insert into tb values('10203' ,null)
insert into tb values('103' ,null)
go

update tb set kmmx = (case when exists (select 1 from tb where charindex(t.kmdm,kmdm) > 0 and t.kmdm <> kmdm) then 0 else 1 end) from tb t

select * from tb

drop table tb

/*
kmdm kmmx
---------- -----------
101 1
102 0
10201 1
10202 1
10203 1
103 1

(所影响的行数为 6 行)
*/
回复
SQLCenter 2010-09-22
--> 测试数据:#
if object_id('tempdb.dbo.#') is not null drop table #
create table #(kmdm int, kmmx int)
insert into #
select 101, 1 union all
select 102, 1 union all
select 10201, 1 union all
select 10202, 1 union all
select 10203, 1 union all
select 103, 1

-- 全变1了是吧?那把有下级明细的找出来,UPDATE为0
update # set kmmx = 0 from # t where exists (select 1 from # where kmdm<>t.kmdm and ltrim(kmdm) like ltrim(t.kmdm)+'%')

select * from #
/*
kmdm kmmx
----------- -----------
101 1
102 0
10201 1
10202 1
10203 1
103 1
*/
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-09-22 12:08
社区公告
暂无公告