ネストされたMSSQLプロシージャから親プロシージャへのエラーパス -- sql フィールド と sql-server フィールド と tsql フィールド と stored-procedures フィールド 関連 問題

Error Pass from nested MSSQL procedure to parent procedure












0
vote

問題

日本語

親ストアドプロシージャと1つのネストされたストアドプロシージャを1つあります。親ストアドプロシージャは、LOOPのネストされたストアドプロシージャを呼び出します。これで、特定の条件が一致したときにエラーが発生しました。このエラーが発生したら、すべてのプロセスを停止してエラーを返します。

<事前> <コード> CREATE Proc [dbo].[Usp_GenSalarySheet](@SalData [HRM].UTDT_SalaryData ReadOnly) AS set nocount on DECLARE @SMT NVARCHAR(MAX) SET @SMT = 'Create Table ##SalarySheet (StaffID INT,FullName NVARCHAR(1024),PresentDays NVARCHAR(1024),Absent NVARCHAR(1024),Department NVARCHAR(1024),Designation NVARCHAR(1024),' DECLARE @HopName nvarchar(max) Declare HOPCursor cursor for select ID from HRM.tbl_HOP OPEN HOPCursor FETCH NEXT FROM HOPCursor INTO @HopName WHILE @@FETCH_STATUS = 0 BEGIN SET @SMT = @SMT + ' [' + @HopName + '] DECIMAL(19,7),' FETCH NEXT FROM HOPCursor into @HopName END SET @SMT = @SMT + '[Total] DECIMAL(19,7))' CLOSE HOPCursor DEALLOCATE HOPCursor print (@smt) exec (@SMT) select * into #temp from @SalData Declare @TopID INT While (Select Count(*) From #Temp) > 0 Begin Select Top 1 @TopID = StaffID From #temp Declare @StaffID INT =(select top 1 StaffID from #temp) Declare @StaffName NVARCHAR(1024) = (SELECT TOP 1 FullName FROM #temp) Declare @WorkingDays Int = (SELECT top 1 WorkingDays from #temp) Declare @Leave INT = (SELECT top 1 [Absent] from #temp) INSERT INTO ##SalarySheet(StaffID,FullName,[Absent]) values(@StaffID,@StaffName,@Leave) DECLARE @HOPType INT DECLARE @Value Decimal(19,7) DECLARE @CalcVal DECIMAL(19,7) = 0 DECLARE @Formula NVARCHAR(MAX) DECLARE @Total DECIMAL(19,7) DECLARE @PayEvery INT DECLARE @Round Int Declare HOPList Cursor for SELECT ID,HOPType,Value,Formula,RoundOff,PayEvery FROM HRM.Tbl_HOP order by Schedule open HOPList FETCH NEXT FROM HOPList INTO @HopName,@HOPType,@Value,@Formula,@Round,@PayEvery WHILE @@FETCH_STATUS = 0 BEGIN if exists(select * from HRM.[Tbl_ContractHOPDetails] where PersonalDetailsID = @StaffID and HOPID = @HopName) print('select * from HRM.[Tbl_ContractHOPDetails] where PersonalDetailsID = ' + convert(varchar(max), @StaffID) + ' and HOPID =' + convert(varchar(max),@HopName)) begin if(@HOPType=51) begin exec HRM.Usp_GetSalaryValueFromFormula @StaffID,@Formula,@HOPType,@Leave,@WorkingDays,@Value output set @HOPType= 50 end if(@HOPType=50) begin set @CalcVal = @value END IF(@HOPType=38) BEGIN SET @CalcVal = @Value - ((@Value/@WorkingDays) * @Leave) END if(@PayEvery= 40) begin set @CalcVal = ((@CalcVal * @WorkingDays) - (@CalcVal * @Leave)) end if(@Round = 45) begin set @CalcVal = round(@CalcVal,2) end else if(@Round = 46) begin set @CalcVal = CEILING(@CalcVal) end else if(@Round = 47) begin set @CalcVal = FLOOR(@CalcVal) end set @SMT ='UPDATE ##SalarySheet SET [' + @HopName + '] = ' + cast(@CalcVal as nvarchar(max)) + ' where StaffID = ' + cast(@StaffID as nvarchar(max)) exec (@smt) end SET @CalcVal = 0 FETCH NEXT FROM HOPList INTO @HopName,@HOPType,@Value,@Formula,@Round,@PayEvery END close HOPList DEALLOCATE HOPList set @SMT ='UPDATE ##SalarySheet SET [Total] = ' + cast(@Total as nvarchar(max)) + ' where StaffID = ' + cast(@StaffID as nvarchar(max)) exec (@smt) Delete #temp Where StaffID = @TopID end select * from ##SalarySheet drop table ##SalarySheet

これは私の親保存されたプロージェレとネストされた手順は以下のとおりです。

<事前> <コード> CREATE proc [HRM].[Usp_GetSalaryValueFromFormula](@StaffID INT,@val nvarchar(max),@HOPType INT,@Leave INT,@WorkingDays INT, @GetResult Decimal(19,7) output) as set nocount on Declare @Formula Varchar(max) declare @initial INT =0 declare @final INT =0 Declare @DataVal NVARCHAR(MAX) -- set the value from HOP table declare @FieldVal nvarchar(max) declare @cnt int = 0 Declare @Complete Int =CHARINDEX ('[',@val,0) while (@Complete <> 0) begin set @initial = CHARINDEX ('[',@val,0) set @final = CHARINDEX(']',@val,0) set @FieldVal = SUBSTRING(@val,@initial,(@final-@initial) + 1) if len(@FieldVal)<>0 begin select @HOPType = HOPType, @DataVal= ( case when HOPType = 51 then [Formula] else cast([Value] as nvarchar(max)) end) from HRM.Tbl_ContractHOPDetails where PersonalDetailsID = @StaffID and HOPID in(select ID from HRM.tbl_HOP where HOPName = replace(replace(@fieldVal,'[',''),']','')) if (@DataVal is null or @DataVal ='') begin RAISERROR ('Nested HOP is not defined.',11,1) RETURN end print(@DataVal) if ISNUMERIC(@DataVal)=1 begin if(@HOPType = 38) begin SET @DataVal = cast(@DataVal as decimal(19,7)) - ((cast(@DataVal as decimal(19,7))/@WorkingDays) * @Leave) end end set @val = replace(@val,@fieldVal,@DataVal) set @fieldVal= '' set @DataVal = '' end set @Complete = CHARINDEX ('[',@val,0) set @fieldVal ='' set @final =0 set @initial = 0 end SET @Complete =CHARINDEX ('{',@val,0) while (@Complete <> 0) BEGIN set @initial = CHARINDEX ('{',@val,0) set @final = CHARINDEX('}',@val,0) set @FieldVal = SUBSTRING(@val,@initial+1,(@final-@initial)-1) if len(@FieldVal)<>0 begin set @DataVal = isnumeric((SELECT 0 FROM [HRM].Tbl_StaffTag where CValue = @FieldVal and StaffID = @StaffID)) set @FieldVal = '{' + @FieldVal + '}' set @val = replace(@val,@fieldVal,@DataVal) set @fieldVal= '' set @DataVal = '' end set @Complete = CHARINDEX ('{',@val,0) set @final =0 set @initial = 0 END DECLARE @RetrunVal DECIMAL(19,7) declare @ParmDefinition Nvarchar(512) = '@GetVal decimal(19,7) OUTPUT' Declare @SMT NVARCHAR(MAX) = ' SET @GetVal = ' + @val EXECUTE sp_executeSQL @Smt, @ParmDefinition, @GetVal =@RetrunVal OUTPUT set @GetResult = @RetrunVal

しかし現在の状況では、次のループの次のステップステップを実行するメイン手順から、エラーが発生します。しかし、このRaisError

の後に完全なプロセスを終了したいです。

親切に私を助けてくれる

英語

I have one parent stored procedure and one nested stored procedure. Parent Stored procedure calls the nested stored procedure on loop. Now when there is certain condition matches I have raised the error. When this error is raised I want to stop all the process and return the error.

CREATE Proc [dbo].[Usp_GenSalarySheet](@SalData [HRM].UTDT_SalaryData ReadOnly) AS     set nocount on     DECLARE @SMT NVARCHAR(MAX)     SET @SMT = 'Create Table ##SalarySheet (StaffID INT,FullName NVARCHAR(1024),PresentDays NVARCHAR(1024),Absent NVARCHAR(1024),Department NVARCHAR(1024),Designation NVARCHAR(1024),'     DECLARE @HopName nvarchar(max)     Declare HOPCursor cursor for select ID from HRM.tbl_HOP      OPEN HOPCursor      FETCH NEXT FROM HOPCursor INTO @HopName         WHILE @@FETCH_STATUS = 0         BEGIN             SET @SMT = @SMT + ' [' +  @HopName + '] DECIMAL(19,7),'             FETCH NEXT FROM HOPCursor into @HopName         END         SET @SMT = @SMT + '[Total] DECIMAL(19,7))'     CLOSE HOPCursor     DEALLOCATE HOPCursor     print (@smt)     exec (@SMT)      select * into #temp  from @SalData     Declare @TopID INT     While (Select Count(*) From #Temp) > 0     Begin         Select Top 1 @TopID = StaffID From #temp         Declare @StaffID INT =(select top 1 StaffID from #temp)         Declare @StaffName NVARCHAR(1024) = (SELECT TOP 1 FullName FROM #temp)         Declare @WorkingDays Int = (SELECT top 1 WorkingDays from #temp)         Declare @Leave INT = (SELECT top 1 [Absent] from #temp)          INSERT INTO ##SalarySheet(StaffID,FullName,[Absent]) values(@StaffID,@StaffName,@Leave)          DECLARE @HOPType INT         DECLARE @Value Decimal(19,7)         DECLARE @CalcVal DECIMAL(19,7) = 0          DECLARE @Formula NVARCHAR(MAX)         DECLARE @Total DECIMAL(19,7)         DECLARE @PayEvery INT         DECLARE @Round Int         Declare HOPList Cursor for SELECT ID,HOPType,Value,Formula,RoundOff,PayEvery FROM HRM.Tbl_HOP order by Schedule         open HOPList             FETCH NEXT FROM HOPList INTO @HopName,@HOPType,@Value,@Formula,@Round,@PayEvery             WHILE @@FETCH_STATUS = 0                 BEGIN                     if exists(select * from HRM.[Tbl_ContractHOPDetails] where PersonalDetailsID = @StaffID and HOPID = @HopName)                     print('select * from HRM.[Tbl_ContractHOPDetails] where PersonalDetailsID = ' + convert(varchar(max), @StaffID) + ' and HOPID =' + convert(varchar(max),@HopName))                         begin                         if(@HOPType=51)                             begin                                 exec HRM.Usp_GetSalaryValueFromFormula @StaffID,@Formula,@HOPType,@Leave,@WorkingDays,@Value output                             set @HOPType= 50                             end                         if(@HOPType=50)                             begin                                 set @CalcVal = @value                             END                         IF(@HOPType=38)                             BEGIN                                 SET @CalcVal = @Value - ((@Value/@WorkingDays) * @Leave)                             END                              if(@PayEvery= 40)                                 begin                                     set @CalcVal = ((@CalcVal * @WorkingDays) - (@CalcVal * @Leave))                                 end                              if(@Round = 45)                                 begin                                     set @CalcVal = round(@CalcVal,2)                                 end                             else if(@Round = 46)                                 begin                                      set @CalcVal = CEILING(@CalcVal)                                 end                             else if(@Round = 47)                                  begin                                     set @CalcVal = FLOOR(@CalcVal)                                 end                         set @SMT ='UPDATE ##SalarySheet SET [' + @HopName + '] = ' + cast(@CalcVal as nvarchar(max)) + ' where StaffID = ' + cast(@StaffID as nvarchar(max))                     exec (@smt)                     end                     SET @CalcVal = 0                 FETCH NEXT FROM HOPList INTO @HopName,@HOPType,@Value,@Formula,@Round,@PayEvery                 END          close HOPList         DEALLOCATE HOPList             set @SMT ='UPDATE ##SalarySheet SET [Total] = ' + cast(@Total as nvarchar(max)) + ' where StaffID = ' + cast(@StaffID as nvarchar(max))             exec (@smt)      Delete #temp Where StaffID = @TopID     end select * from ##SalarySheet drop table ##SalarySheet 

This is my parent Stored Procudere and nested procedure is as follow:

CREATE proc [HRM].[Usp_GetSalaryValueFromFormula](@StaffID INT,@val nvarchar(max),@HOPType INT,@Leave INT,@WorkingDays INT, @GetResult Decimal(19,7) output) as  set nocount on Declare @Formula Varchar(max) declare @initial INT =0 declare @final INT =0 Declare @DataVal NVARCHAR(MAX) -- set the value from HOP table  declare @FieldVal nvarchar(max) declare @cnt int = 0 Declare @Complete Int =CHARINDEX ('[',@val,0) while (@Complete <> 0) begin     set @initial = CHARINDEX ('[',@val,0)     set @final = CHARINDEX(']',@val,0)     set @FieldVal = SUBSTRING(@val,@initial,(@final-@initial) + 1)     if len(@FieldVal)<>0         begin             select @HOPType = HOPType, @DataVal= ( case when HOPType = 51 then [Formula] else cast([Value] as nvarchar(max)) end)  from HRM.Tbl_ContractHOPDetails where PersonalDetailsID = @StaffID and HOPID in(select ID from HRM.tbl_HOP where HOPName = replace(replace(@fieldVal,'[',''),']',''))             if (@DataVal is null or @DataVal ='')                 begin                     RAISERROR ('Nested HOP is not defined.',11,1)                      RETURN                 end             print(@DataVal)             if ISNUMERIC(@DataVal)=1                 begin                     if(@HOPType = 38)                         begin                             SET @DataVal = cast(@DataVal as decimal(19,7)) - ((cast(@DataVal as decimal(19,7))/@WorkingDays) * @Leave)                         end                 end             set @val = replace(@val,@fieldVal,@DataVal)             set @fieldVal= ''             set @DataVal = ''         end     set @Complete = CHARINDEX ('[',@val,0)     set @fieldVal =''     set @final =0     set @initial = 0 end SET @Complete =CHARINDEX ('{',@val,0) while (@Complete <> 0)     BEGIN         set @initial = CHARINDEX ('{',@val,0)         set @final = CHARINDEX('}',@val,0)         set @FieldVal = SUBSTRING(@val,@initial+1,(@final-@initial)-1)         if len(@FieldVal)<>0             begin                 set @DataVal = isnumeric((SELECT 0 FROM [HRM].Tbl_StaffTag where CValue = @FieldVal and StaffID = @StaffID))                 set @FieldVal = '{' + @FieldVal + '}'                 set @val = replace(@val,@fieldVal,@DataVal)                 set @fieldVal= ''                 set @DataVal = ''             end         set @Complete = CHARINDEX ('{',@val,0)         set @final =0         set @initial = 0     END  DECLARE @RetrunVal DECIMAL(19,7) declare @ParmDefinition Nvarchar(512) = '@GetVal decimal(19,7)  OUTPUT' Declare @SMT NVARCHAR(MAX) = ' SET @GetVal = ' + @val EXECUTE sp_executeSQL @Smt, @ParmDefinition, @GetVal =@RetrunVal OUTPUT set @GetResult = @RetrunVal 

But in current situation it raises error and again from the main procedure it runs next step of loop. But I want to terminate the complete process after this raiserror

Kindly help me

</div
           
 
 

回答リスト

0
 
vote

私の推測は、AlesireRrorがコントロールを呼び出し側に戻します。これにより、RETURN文が到達できなくなる可能性があります。発信者(ループ)は次の反復で続行されます。

 

My guess is that RaiseError throws the control back to the caller, which might make the Return statement unreachable. The caller (loop) continues with next iteration.

</div
 
 

関連する質問

63  バージョンを管理する最善の方法は、My SQL Serverストアドプロシージャを制御しますか? [閉まっている]  ( What is the best way to version control my sql server stored procedures ) 
現在立つにつれて、この質問は私たちのQ&AMPにとって良いフィットではありません。フォーマット。私たちは事実、参考文献、または専門知識によって支持されることを期待していますが、この質問は...

31  ストアドプロシージャ - 日の終わり  ( Stored procedures end of days ) 
私はHanselminutes Podcastを聞いています。 「StackoverflowはASP.NET MVC - Jeff Atwoodと彼の技術チームを使用します」。ポッドキャストの過程で、彼らはSQL Serverについて話していて、「ストアド...

6  PHPからMySQLストアドプロシージャを作成する方法  ( How to create a mysql stored procedure from php ) 
店舗手続き(SP)のCREATE文を使ってPHPからMySQLを照会しようとした試みはすべて失敗しました。これは不可能ですか? 実際に可能な場合は、例を付けてください。 ...

3  手続きを保存する必要がありますか、または集中しているか  ( Should stored procedures be many or focused ) 
あなたはあなたのストアード手続きをどのようにしてくださいか?彼らは「一撃」と見なされるべきか、より一般的な使用を鏡を照らすべきですか?次のような場合を考えてください。 1 finduser(username、...) ストアドプロシージャは、ユーザI...

1  SQL Server CLRストアドプロシージャJSONパラメータ  ( Sql server clr stored procedure json parameter ) 
私は、いくつかの動的SQLを生成するためのストアドプロシージャに大量のデータを渡したいシナリオに出会いました。 渡したいデータは、私のASP.NET MVC Webプロジェクトで使用するこのJSON / C#クラスオブジェクトに格納されています。 <事前> <...

0  ストアドプロシージャ付きのホストはどこにありますか?  ( Where can i find a host with stored procedures ) 
MySQLストアドプロシージャとビューを使用するプロジェクトを作成しました。 私はそれらをサポートするホスティングサービスを見つけるのが多くの困難を持っています。 あなたは私がどこへ行くことができるか知っていますか? ありがとうございました。 ...

0  DB2で静的カーソルを作成する方法  ( How to create static cursor in db2 ) 
DB2で静的カーソルを作成しながら問題に直面しています。これは私が私のspで使った声明です。 <事前> <コード> DECLARE CURNAME SENSITIVE STATIC SCROLL CURSOR FOR SELECT COL1...

1  FKテーブルへのカスケードのための私の削除ストアドプロシージャアカウントは?  ( Should my delete stored procedure account for cascading to fk tables ) 
従業員テーブル(PKはemperysectID)と販売テーブルに販売テーブルがemperysionidのFK列があるとします。 ここでDeleteMployeeストアドプロシージャを設計するときは、販売テーブルの行を最初に削除するか、各テーブルで削除するための...

0  更新レコードを更新するには、変更されていない値を処理する方法  ( Sproc to update record how to handle unchanged values ) 
私はDALからのアップデートのスプロックを呼び出して、テーブルのすべての(!)フィールドをパラメータとして渡します。最大のテーブルの場合、これは合計78です。 ただ1つの値が変更された場合でも、これらすべてのパラメータを渡します。 これは私にとってはかなり感...

274  SQLを保存されたPROCSに保存するための長所と短所とは何ですか。  ( What are the pros and cons to keeping sql in stored procs versus code ) 
閉鎖。この質問は意見ベースです。現在答えを受け付けていません。 閉じられた 6年前>。 ロック。この質問とその答えは <...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有