存储过程

yfym2007 2008-03-18 06:27:39
目的:
把数据一条一条地插入,发现重复的执行UPDATE,不重复的插入。
建立如下的存储过程:
CREATE PROCEDURE ss
as
begin
declare @count [nvarchar] (20)
declare cur_custer cursor
for
select [保单号] from ss_temp
print '开始执行'
open cur_custer
fetch next from cur_custer into @count
while(@@fetch_status=0) --循环开始
begin
if EXISTS(select 业务实收表.保单号 from 业务实收表 join ss_temp on 业务实收表.保单号=ss_temp.保单号 where 业务实收表.保单号=@count)
begin
Exec('update 业务实收表 set 财务结清日期=aa.财务结清日期,业务实收表.电子收据保费=业务实收表.电子收据保费+aa.电子收据保费 from ss_temp aa where aa.保单号=业务实收表.保单号 and aa.保单号='+@count)
print '更新'
end
else
begin
Exec('insert 业务实收表 select * from ss_temp where ss_temp.保单号='+@count)
print '插入'
print 'test'
end
fetch next from cur_custer into @count
end
print '结束'
close cur_custer --关闭游标
deallocate cur_custer--释放资源
end
GO

调用这个存储过程,查询分析器的结果只显示“开始执行”和“结束”两个,也就是中间的循环根本没有执行,哪位高人帮我看一下是哪里错了,造成这个存储过程没有执行,谢谢!
...全文
277 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
yfym2007 2008-03-19
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 gdgde 的回复:]
进来MARK
[/Quote]

????
gdgde 2008-03-19
  • 打赏
  • 举报
回复
进来MARK
yfym2007 2008-03-19
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wzy_love_sly 的回复:]
怎么又改回这种了?
[/Quote]
是啊 ,“无枪狙击手”我用了您的语句还是回到原来的情况啊 ,我一执行存储过程,立马就提示主键出现重复了啊!
xingchenbbs 2008-03-19
  • 打赏
  • 举报
回复
星辰技术社区:www.netcsharp.cn,我们将帮您以最快的速度找到最佳的解决方案
cxmcxm 2008-03-18
  • 打赏
  • 举报
回复
语法既然没错,就只有表ss_temp无记录的可能,
加上
select * from ss_temp 看看有无记录
wzy_love_sly 2008-03-18
  • 打赏
  • 举报
回复
怎么又改回这种了?
-狙击手- 2008-03-18
  • 打赏
  • 举报
回复
update bb   
set 财务结清日期=aa.财务结清日期,bb.电子收据保费=bb.电子收据保费+aa.电子收据保费
from ss_temp aa
right join 业务实收表 bb
on aa.保单号=bb.保单号
where exists(select 1 from 业务实收表 where 保单号=aa.保单号 )
-狙击手- 2008-03-18
  • 打赏
  • 举报
回复
update bb   
set 财务结清日期=aa.财务结清日期,bb.电子收据保费=bb.电子收据保费+aa.电子收据保费
from ss_temp aa
right join 业务实收表 bb
on aa.保单号=bb.保单号
and exists(select 1 from 业务实收表 where 保单号=aa.保单号 )



sorry


yfym2007 2008-03-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 happyflystone 的回复:]
update bb
set 财务结清日期=aa.财务结清日期,aa.电子收据保费=bb.电子收据保费+aa.电子收据保费
from ss_temp aa
right join 业务实收表 bb
where aa.保单号=bb.保单号
and exists(select 1 from 业务实收表 where 保单号=aa.保单号


insert 业务实收表
select *
from ss_temp a
where not exists( select 1 from 业务实收表 where 保单号=a.保单号)
[/Quote]
我用您的语句修改了一下存储过程,在建立的时候提示:
“服务器: 消息 1032,级别 15,状态 1,过程 ss,行 14
无法使用列前缀 'aa'。此前缀必须与 UPDATE 子句 'bb' 中的对象匹配。
服务器: 消息 156,级别 15,状态 1,过程 ss,行 17
在关键字 'where' 附近有语法错误。

”这个是什么原因呢?谢谢!
-狙击手- 2008-03-18
  • 打赏
  • 举报
回复
update bb
set 财务结清日期=aa.财务结清日期,aa.电子收据保费=bb.电子收据保费+aa.电子收据保费
from ss_temp aa
right join 业务实收表 bb
where aa.保单号=bb.保单号
and exists(select 1 from 业务实收表 where 保单号=aa.保单号


insert 业务实收表
select *
from ss_temp a
where not exists( select 1 from 业务实收表 where 保单号=a.保单号)
yfym2007 2008-03-18
  • 打赏
  • 举报
回复
是这样的,我现在的临时表ss_temp存在重复数据,所以我希望一条一条地导入目标数据表“业务实收表”,然后,如果目标表存在这条数据,那么就更新目标表,如果不存在,则插入。如果是按照这种思路进行插入数据的话,目标表应该就不会有重复数据了。所以我在目标表设置主键。但是问题是,我现在遇到的问题是,源数据两条重复的数据要插入目标表时,提示违反了主键的约速。但是我们设想的用游标写的存储过程不是一条一条插入吗?如果说目标数据库不存在这条记录,它应该插入。当源数据的重复数据要插入的时候,根据我们的设计,应该是执行更新的过程,为什么还是提示违反主键约束规则呢?
yfym2007 2008-03-18
  • 打赏
  • 举报
回复
大家对于我说的这种源与目标都存在重复数据的情况有什么比较好的办法吗?谢谢!
-狙击手- 2008-03-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yfym2007 的回复:]
因为源数据存在重复数据,同时,源与目的也存在重复数据,所以我希望用游标,一条一条记录地插入。才不会出现主键重复的问题。
[/Quote]


源有重复数据,目标也有重复,
那不是说明你没主键了呀,否则怎么保存呀
yfym2007 2008-03-18
  • 打赏
  • 举报
回复
就是因为希望把这些重复的主键去掉才写了这个游标的存储过程,希望一条一条插入把重复的数据剔除掉。
wzy_love_sly 2008-03-18
  • 打赏
  • 举报
回复
我只看了大概,sorry
yfym2007 2008-03-18
  • 打赏
  • 举报
回复
因为源数据存在重复数据,同时,源与目的也存在重复数据,所以我希望用游标,一条一条记录地插入。才不会出现主键重复的问题。
-狙击手- 2008-03-18
  • 打赏
  • 举报
回复
我们现在使用的这个存储过程不是使用游标一条一条记录地插入吗?为什么我的ss_temp表里面两条两着的记录,他们主键一样,导入数据的时候却提示主键重复呢?我们现在的这个存储过程应该是支持在源数据存在重复,以及在源与目标数据存在重复的时候都可以发现并进行更新的吗?这个又是为什么呢?


---
只要主键不重复就不会出错啦
wzy_love_sly 2008-03-18
  • 打赏
  • 举报
回复
不用游标不可以吗?

update tb set a='a' from tb a where exists(select 1 from b wher a.id=b.id)
insert into tb select * from tb a where not exists(select 1 from b where a.id=b.id)
yfym2007 2008-03-18
  • 打赏
  • 举报
回复
我们现在使用的这个存储过程不是使用游标一条一条记录地插入吗?为什么我的ss_temp表里面两条两着的记录,他们主键一样,导入数据的时候却提示主键重复呢?我们现在的这个存储过程应该是支持在源数据存在重复,以及在源与目标数据存在重复的时候都可以发现并进行更新的吗?这个又是为什么呢?
-狙击手- 2008-03-18
  • 打赏
  • 举报
回复
begin
Exec('insert 业务实收表 select * from ss_temp where ss_temp.保单号='''+@count+'''')
print '插入'
print 'test'
加载更多回复(9)

34,590

社区成员

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

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