这个存储过程该怎么写?(请高手支招)(100分)

  • 主题发起人 主题发起人 qinjjun
  • 开始时间 开始时间
Q

qinjjun

Unregistered / Unconfirmed
GUEST, unregistred user!
CREATE PROCEDURE SP_XXX
(@code [char](30),
@id [char](10)
@error_code [int] output)

AS

if @error_code=0
INSERT INTO [XXX]
( code,
id)
VALUES
( @code,
@id)

if (@@error<>0)
begin
UPDATE [XXX]
SET
代码:
 = @code,
[id]=@id
WHERE 
( [code]	 = @code)
end

select @error_code= @@error
GO
执行环境(sql2000,delphi 5)

有重复记录时,delphi会捕捉到异常
如何写这个过程才能屏蔽异常?
 
我在interbase中是这样实现的:

select code from xxx where code = :code into :v_code
if (v_code = code) then
update ...
else
insert ...

sql server 里好象可以这样写:
select @v_code=code from [xxx] where code =@code
if (@v_code=@code) then
update...
else
insert...



 
我原来就是这么写的,
问题是数据库的记录太大,不能使用select命令
 
数据库的记录太大应不成问题,将
select @v_code=code from [xxx] where code =@code
用一个CURSOR取代,以下部分放在CURSOR循环体中。
if (@v_code=@code) then
update...
else
insert...
 
SQL Server里可以这么写:

if exists (select * from XXX where code = @code)
update XXX set code = @code, id = @id where code = @code
else
insert into XXX (code, id) values(@code, @id)
 
TO aspire
我的存储过程要调用几万次至几百万次
每次调用都会执行一次select命令(每次零点几秒)
你的执行效率和madm是一样的。
效率太低,有没有屏蔽这个异常的方法。
 
你应该先UPDATE以后,根据系统变量@@COUNT来判断UPDATE所影响的参数,若@@count<1,则表明
UPDATE语句没有影响记录,说明数据库中不存在该记录,然后你再INSERT就不会出错了,这种写
法我经常用,不知道是否适合你,有什么问题的话MAIL 我:lipingcool@263.net
CREATE PROCEDURE SP_XXX
(@code [char](30),
@id [char](10),
@error_code [int] output)
AS
declare @count int

BEGIN

UPDATE [XXX] SET
代码:
 = @code,[id]=@id
WHERE ( [code]	 = @code)

select @error_code = @@error, @count= @@rowcount	
	     		
if @error <> 0 
    begin
    raiserror('update XXX error', 16,1)
    rollback tran
    return 
    end

if @count = 0
    --插入新记录
    begin					
    INSERT INTO [XXX] ( code, id) VALUES ( @code,@id)		
			
    if @@error <> 0
    	begin
    	raiserror('insert XXX error', 16, 1)
    	rollback tran
	return	
    	end
                                
    end           

END
 
To lipingcool:

使用你的方法是不会报错了,
也比较有效率,
但还不是我想知道的。

我想知道的是因为错误信息严重级别可用来表明
Microsoft&amp;reg; SQL Server&amp;#8482; 2000 所遇到问题的类型。

严重级别为 11 到 16 的错误是由用户产生的,可以由用户修正。

我使用了事务处理,但可能是因为rollback时,
insert命令并没有执行,所以实际上rollback并没有真正执行
即可能是某些错误的标志位没有恢复,
(如果成功了就不会报错,我试过)
所以异常激发到了delphi中,
有没有办法是屏蔽?

 
在 delphi中用
TRY
....
EXCEPT
....
END
来捕捉异常,然后对进行处理.
 
我同意飞龙在天的观点!
 
多人接受答案了。
 
后退
顶部