2009-09-01 9 views
0

SQL Serverでsqlcmdツールを使用してスクリプトを実行しています。スクリプトはレコードを追加/更新します。スクリプトがエラーをスローすると、実行を停止して0以外の戻り値を与えるためにsqlcmdが必要です。私は次のものはうまくいくと思ったが、そうはしない。sqlcmd gotoが正常に動作していないエラー

DECLARE @intErrorCode INT 
BEGIN TRAN T1; 

SET IDENTITY_INSERT dbo.SomeTable ON 

INSERT INTO dbo.SomeTable(some_type_id,some_type,code_definition,use_some_lookup,created_by,created_on,modified_by,modified_on,org_some) 
VALUES(0,'yadayada','None','N','system',GETDATE(),'system',GETDATE(),'N') 

SELECT @intErrorCode = @@ERROR 
    IF (@intErrorCode <> 0) GOTO PROBLEM 

SET IDENTITY_INSERT dbo.SomeTable OFF 


UPDATE dbo.SomeTable 
SET some_type = 'Contract Analytical' 
WHERE some_type_id = 2 

SELECT @intErrorCode = @@ERROR 
    IF (@intErrorCode <> 0) GOTO PROBLEM 



PROBLEM: 
IF (@intErrorCode <> 0) BEGIN 
PRINT 'Unexpected error occurred!' 
    ROLLBACK TRAN 
    SELECT @intErrorCode 
    RETURN 
END 
COMMIT TRAN T1; 

答えて

0

したい場合は、それを選択する

RETURN @intErrorCode 

たala @intErrorCode

に値を返すことができますゼロ以外の戻り値ではなく、戻り値よりも結果セットで返します。

0

のtry-catchを使用してみてください:

DECLARE @intErrorCode INT 
BEGIN TRY 
    BEGIN TRAN T1; 

    SET IDENTITY_INSERT dbo.SomeTable ON 

    INSERT INTO dbo.SomeTable (some_type_id,some_type,code_definition,use_some_lookup,created_by,created_on,modified_by,modified_on,org_some) 
     VALUES(0,'yadayada','None','N','system',GETDATE(),'system',GETDATE(),'N') 

    SET IDENTITY_INSERT dbo.SomeTable OFF 


    UPDATE dbo.SomeTable 
     SET some_type = 'Contract Analytical' 
     WHERE some_type_id = 2 

END TRY 
BEGIN CATCH 

    IF XACT_STATE()!=0 
    BEGIN 
     ROLLBACK TRANSACTION 
    END 

    SELECT 
     ,ERROR_NUMBER() AS ErrorNumber --same as @@ERROR 
     ,ERROR_SEVERITY() AS ErrorSeverity 
     ,ERROR_STATE() AS ErrorState 
     ,ERROR_PROCEDURE() AS ErrorProcedure 
     ,ERROR_LINE() AS ErrorLine 
     ,ERROR_MESSAGE() AS ErrorMessage 

    PRINT 'Unexpected error occurred!' 
    RETURN 999 

END CATCH 
COMMIT TRAN T1; 
RETURN 0