这些我都知道,但关键是,程序已经异常退出,无法执行下面的判断@error语句啊!! 例: CREATE PROCEDURE up_test AS BEGIN SELECT Field1 FROM Table1 /*如果Field1不存在,执行到这一句就异常退出整个存储过程了*/ IF @ERROR <> 0 /*无法执行这些语句了*/ RETURN 1 ELSE RETURN 0 END
if @@Error<>0 begin raiseerror('error',16,1) return end
究竟SQL Server的异常怎么对付??分布式数据库怎么访问?? 看了(大力)的帖,还是没办法解决!! 以下是我的实例(我的主程序调用up_p1,up_p1调用up_p2): CREATE PROCEDURE up_p1 AS BEGIN DECLARE @SourceIP varchar(15) DECLARE @SourceUser varchar(15) DECLARE @SourcePwd varchar(15) DECLARE @ret int DECLARE @D1 smalldatetime DECLARE @D2 smalldatetime
SET @D1 = DATEADD(day,-1,GETDATE()) SET @D2 = GETDATE() SET @ret = 0 DECLARE csProject CURSOR FOR SELECT SourceIP,SourceUser,SourcePwd FROM tbDataSource OPEN csProject --取得数据源 FETCH NEXT FROM csProject INTO @SourceIP,@SourceUser,@SourcePwd IF @@FETCH_STATUS = 0 BEGIN IF EXISTS(SELECT * FROM master.dbo.sysservers WHERE srvname = 'source') EXECUTE sp_dropserver 'source', 'droplogins' --建立连接 EXECUTE sp_addlinkedserver @server = 'source', @srvproduct = '', @provider = 'SQLOLEDB', @datasrc = @SourceIP IF @@ERROR = 0 BEGIN --登录 EXECUTE sp_addlinkedsrvlogin 'source', 'false', NULL, @SourceUser, @SourcePwd if @@ERROR = 0 --执行处理过程 EXECUTE @ret = up_p2 @D1,@D2 --由于执行up_p2异常退出整个程序,以下语句全部没执行 ELSE SET @ret = 3 END ELSE SET @ret = 2 END ELSE SET @ret = 1 CLOSE csProject DEALLOCATE csProject /*后处理模块*/ --由于执行up_p2异常退出整个程序,无法执行这些模块 RETURN @ret END-------------------------------------------------- CREATE PROCEDURE up_p2 @Date1 smalldatetime, @Date2 smalldatetime AS BEGIN DECLARE @sql varchar(1000) DECLARE @ErrorCode int SET @ErrorCode = 0 -- 最初代码 /* SELECT * FROM source.RemoteDB.dbo.tb1 WHERE ReportTime>@Date1 AND ReportTime<=@Date2 */ --看了(大力)的帖后改用Execute执行 /* SET @sql = 'SELECT * FROM source.RemoteDB.dbo.tb1 WHERE ReportTime>@Date1 AND ReportTime<=@Date2' --这样会出现@Date1,@Date2没定义 */ SET @sql = 'SELECT * FROM source.RemoteDB.dbo.tb1 WHERE ReportTime>''' + CONVERT(varchar(20),@Date1,120) + ''' AND ReportTime<=''' + CONVERT(varchar(20),@Date2,120) + '''' PRINT @sql EXECUTE(@sql) --到这里会出现"SQL Server 不存在或访问被拒绝",异常退出,无法执行下面的语句。但网络通时没事 SET @ErrorCode = @@ERROR RETURN @ErrorCode END
返回最后执行的 Transact-SQL 语句的错误代码。语法
@@ERROR返回类型
integer注释
当 Microsoft® SQL Server™ 完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL 语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。由于 @@ERROR 在每一条语句执行后被清除并且重置,应在语句验证后立即检查它,或将其保存到一个局部变量中以备事后查看。
Transact-SQL 参考
@@ERROR
返回最后执行的 Transact-SQL 语句的错误代码。语法
@@ERROR返回类型
integer注释
当 Microsoft® SQL Server™ 完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL 语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。由于 @@ERROR 在每一条语句执行后被清除并且重置,应在语句验证后立即检查它,或将其保存到一个局部变量中以备事后查看。示例
A.用 @@ERROR 检测一个特定错误
下面的示例用 @@ERROR 在一个 UPDATE 语句中检测限制检查冲突(错误 #547)。USE pubs
GO
UPDATE authors SET au_id = '172 32 1176'
WHERE au_id = "172-32-1176"IF @@ERROR = 547
print "A check constraint violation occurred"B.用 @@ERROR 有条件地退出一个过程
在此示例中,IF...ELSE 语句在存储过程中的 INSERT 语句后检测 @@ERROR。@@ERROR 变量的值将决定传给调用程序的返回值,以指示此过程的成功与失败。USE pubs
GO-- Create the procedure.
CREATE PROCEDURE add_author
@au_id varchar(11),@au_lname varchar(40),
@au_fname varchar(20),@phone char(12),
@address varchar(40) = NULL,@city varchar(20) = NULL,
@state char(2) = NULL,@zip char(5) = NULL,
@contract bit = NULL
AS-- Execute the INSERT statement.
INSERT INTO authors
(au_id, au_lname, au_fname, phone, address,
city, state, zip, contract) values
(@au_id,@au_lname,@au_fname,@phone,@address,
@city,@state,@zip,@contract)-- Test the error value.
IF @@ERROR <> 0
BEGIN
-- Return 99 to the calling program to indicate failure.
PRINT "An error occurred loading the new author information"
RETURN(99)
END
ELSE
BEGIN
-- Return 0 to the calling program to indicate success.
PRINT "The new author information has been loaded"
RETURN(0)
END
GOC.用 @@ERROR 检测几条语句的成功
下面的示例取决于 INSERT 和 DELETE 语句的成功操作。局部变量在两条语句后均被设置为 @@ERROR 的值,并且用于此操作的共享错误处理例程中。USE pubs
GO
DECLARE @del_error int, @ins_error int
-- Start a transaction.
BEGIN TRAN-- Execute the DELETE statement.
DELETE authors
WHERE au_id = '409-56-7088'-- Set a variable to the error value for
-- the DELETE statement.
SELECT @del_error = @@ERROR-- Execute the INSERT statement.
INSERT authors
VALUES('409-56-7008', 'Bennet', 'Abraham', '415 658-9932',
'6223 Bateman St.', 'Berkeley', 'CA', '94705', 1)
-- Set a variable to the error value for
-- the INSERT statement.
SELECT @ins_error = @@ERROR-- Test the error values.
IF @del_error = 0 AND @ins_error = 0
BEGIN
-- Success. Commit the transaction.
PRINT "The author information has been replaced"
COMMIT TRAN
END
ELSE
BEGIN
-- An error occurred. Indicate which operation(s) failed
-- and roll back the transaction.
IF @del_error <> 0
PRINT "An error occurred during execution of the DELETE
statement." IF @ins_error <> 0
PRINT "An error occurred during execution of the INSERT
statement." ROLLBACK TRAN
END
GOD. 与 @@ROWCOUNT 一同使用 @@ERROR
下面的示例用 @@ERROR 和 @@ROWCOUNT 验证一条 UPDATE 语句的操作。为任何可能出现的错误而检验 @@ERROR 的值,而用 @@ROWCOUNT 保证更新已成功应用于表中的某行。USE pubs
GO
CREATE PROCEDURE change_publisher
@title_id tid,
@new_pub_id char(4)
AS-- Declare variables used in error checking.
DECLARE @error_var int, @rowcount_var int-- Execute the UPDATE statement.
UPDATE titles SET pub_id = @new_pub_id
WHERE title_id = @title_id -- Save the @@ERROR and @@ROWCOUNT values in local
-- variables before they are cleared.
SELECT @error_var = @@ERROR, @rowcount_var = @@ROWCOUNT-- Check for errors. If an invalid @new_pub_id was specified
-- the UPDATE statement returns a foreign-key violation error #547.
IF @error_var <> 0
BEGIN
IF @error_var = 547
BEGIN
PRINT "ERROR: Invalid ID specified for new publisher"
RETURN(1)
END
ELSE
BEGIN
PRINT "ERROR: Unhandled error occurred"
RETURN(2)
END
END-- Check the rowcount. @rowcount_var is set to 0
-- if an invalid @title_id was specified.
IF @rowcount_var = 0
BEGIN
PRINT "Warning: The title_id specified is not valid"
RETURN(1)
END
ELSE
BEGIN
PRINT "The book has been updated with the new publisher"
RETURN(0)
END
GO
请参见错误处理@@ROWCOUNTSET @local_variablesysmessages系统函数©1988-2000 Microsoft Corporation。保留所有权利。
例:
CREATE PROCEDURE up_test
AS
BEGIN
SELECT Field1 FROM Table1 /*如果Field1不存在,执行到这一句就异常退出整个存储过程了*/
IF @ERROR <> 0 /*无法执行这些语句了*/
RETURN 1
ELSE
RETURN 0
END
begin
raiseerror('error',16,1)
return
end
http://expert.csdn.net/Expert/TopicView1.asp?id=1675986
看了(大力)的帖,还是没办法解决!!
以下是我的实例(我的主程序调用up_p1,up_p1调用up_p2):
CREATE PROCEDURE up_p1
AS
BEGIN
DECLARE @SourceIP varchar(15)
DECLARE @SourceUser varchar(15)
DECLARE @SourcePwd varchar(15)
DECLARE @ret int
DECLARE @D1 smalldatetime
DECLARE @D2 smalldatetime
SET @D1 = DATEADD(day,-1,GETDATE())
SET @D2 = GETDATE()
SET @ret = 0 DECLARE csProject CURSOR FOR
SELECT SourceIP,SourceUser,SourcePwd FROM tbDataSource
OPEN csProject
--取得数据源
FETCH NEXT FROM csProject
INTO @SourceIP,@SourceUser,@SourcePwd
IF @@FETCH_STATUS = 0
BEGIN
IF EXISTS(SELECT * FROM master.dbo.sysservers WHERE srvname = 'source')
EXECUTE sp_dropserver 'source', 'droplogins'
--建立连接
EXECUTE sp_addlinkedserver
@server = 'source',
@srvproduct = '',
@provider = 'SQLOLEDB',
@datasrc = @SourceIP
IF @@ERROR = 0
BEGIN --登录
EXECUTE sp_addlinkedsrvlogin 'source', 'false', NULL, @SourceUser, @SourcePwd
if @@ERROR = 0 --执行处理过程
EXECUTE @ret = up_p2 @D1,@D2 --由于执行up_p2异常退出整个程序,以下语句全部没执行
ELSE
SET @ret = 3
END
ELSE
SET @ret = 2
END
ELSE
SET @ret = 1 CLOSE csProject
DEALLOCATE csProject
/*后处理模块*/ --由于执行up_p2异常退出整个程序,无法执行这些模块
RETURN @ret
END--------------------------------------------------
CREATE PROCEDURE up_p2
@Date1 smalldatetime,
@Date2 smalldatetime
AS
BEGIN
DECLARE @sql varchar(1000)
DECLARE @ErrorCode int
SET @ErrorCode = 0
-- 最初代码
/* SELECT * FROM source.RemoteDB.dbo.tb1
WHERE ReportTime>@Date1 AND ReportTime<=@Date2 */
--看了(大力)的帖后改用Execute执行
/* SET @sql = 'SELECT * FROM source.RemoteDB.dbo.tb1
WHERE ReportTime>@Date1 AND ReportTime<=@Date2' --这样会出现@Date1,@Date2没定义
*/
SET @sql = 'SELECT * FROM source.RemoteDB.dbo.tb1
WHERE ReportTime>''' + CONVERT(varchar(20),@Date1,120) + ''' AND ReportTime<=''' + CONVERT(varchar(20),@Date2,120) + ''''
PRINT @sql
EXECUTE(@sql) --到这里会出现"SQL Server 不存在或访问被拒绝",异常退出,无法执行下面的语句。但网络通时没事
SET @ErrorCode = @@ERROR
RETURN @ErrorCode
END
这里有老龟奴zyq_123雍亲正当大版主,还有人称辣花摧魔前青楼名妓smoke当镇小版主,肯定能满足您的需要!!!快来吧~~~~~~