2017-09-08 46 views
-2

我有一個主存儲過程,其中有許多子存儲過程,比如10個存儲過程。設置主存儲過程中執行存儲過程的順序

我想要的是,如果我指定存儲過程1,存儲過程2,那麼只有這2個存儲過程應該執行,其他8不應執行。

如果我沒有指定任何值的排序,那麼它應該執行所有的存儲過程。

有人請告訴我該怎麼做?有什麼辦法可以實現它嗎?

我需要1個參數,可以用逗號分隔。也就是說,如果我們在參數中指定1,2那麼它將執行存儲過程1和2

SET QUOTED_IDENTIFIER ON; 
GO 
SET ANSI_NULLS ON; 
GO 
SET NOCOUNT ON; 
GO 


CREATE PROCEDURE dbo.CI_ILR_Indicator_Master 
    (
    @StartYear INT, 
    @EndYear INT 
    ) 
AS 
BEGIN 

--Temptable '#TempILR' is created, which contains the common data needed for all the indicator calculation of 'ILR' 


--Executing the SP [dbo.CI_ILR_Indicator_VRQ_WBL Indicators] for the ILR Indicator group 
--'ILR VRQ WBL' for Indicators (8,9,10) 
EXEC SP1 @StartYear,@EndYear 
EXEC SP2 @StartYear,@EndYear 
EXEC SP3 @StartYear,@EndYear 
EXEC SP4 @StartYear,@EndYear 
EXEC SP5 @StartYear,@EndYear 
EXEC SP6 @StartYear,@EndYear 
EXEC SP7 @StartYear,@EndYear 
EXEC SP8 @StartYear,@EndYear 
EXEC SP9 @StartYear,@EndYear 
EXEC SP10 @StartYear,@EndYear 

END 

這是我的SP的樣子..

+0

嗨通過代碼一旦該宏將會幫助你 –

回答

0
CREATE PROCEDURE [dbo].[Master Sp] 
( 
    @INT_sp1 int= null, 
    @INT_sp2 int= null, 
    @INT_sp3 int= null, 
    @INT_sp4 int= null, 
    @INT_sp5 int= null, 
    @INT_sp6 int= null, 
    @INT_sp7 int= null, 
    @INT_sp8 int= null, 
    @INT_sp9 int= null, 
    @INT_sp10 int= null 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    if @INT_sp1 is not null 
     exec dbo.sp1 
    if @INT_sp2 is not null 
     exec dbo.sp2 
    ...... 
END 

GO 
+0

着我們只需使用1個參數,使其逗號separted。我不知道它會如何做。但是,當我們有50 sp。那麼我們不能繼續添加參數@sapi – Catwoman

0

關注這個存儲過程,它會幫助你

CREATE PROCEDURE [dbo].[Usp_RunSp] --give sp list like 'Sp1,Sp2,Sp3' else by default 
(
@vr_SpList VARCHAR(1000)=NULL, 
@i_StartYear INT , 
@i_EndYear INT 
) 
AS 
    BEGIN 
     BEGIN try 
      IF Object_id('tempdb..#FinalResult')IS NOT NULL 
      DROP TABLE #finalresult 

      IF Object_id('tempdb..#RunSp')IS NOT NULL 
      DROP TABLE #runsp 

      IF Object_id('tempdb..#TotalSPToRun')IS NOT NULL 
      DROP TABLE #totalsptorun 

      CREATE TABLE #finalresult 
      ( 
       Rno  INT, 
       Spnamelist VARCHAR(100) 
      ) 

      CREATE TABLE #totalsptorun 
      ( 
       Id   INT IDENTITY, 
       Spnamelist VARCHAR(100) 
      ) 

      DECLARE @RunSql NVARCHAR(max) 
      DECLARE @Sp_List TABLE 
      ( 
       Spnamelist VARCHAR(100) 
      ) 

      INSERT INTO @Sp_List 
      SELECT @vr_SpList 

      SELECT split.a.value('.', 'nvarchar(1000)') AS SpnameList 
      INTO #runsp 
      FROM (SELECT Cast('<S>' + Replace(Spnamelist, ',', '</S><S>') 
           + '</S>' AS XML) AS Data 
        FROM @Sp_List) AS A 
       CROSS apply data.nodes('S') AS Split(a) 

      INSERT INTO #totalsptorun --add your 10 sp names instead of sp1,sp2 
         (Spnamelist) 
      SELECT 'Sp1'   UNION ALL 
      SELECT 'Sp2'   UNION ALL 
      SELECT 'Sp3'   UNION ALL 
      SELECT 'Sp4'   UNION ALL 
      SELECT 'Sp5'   UNION ALL 
      SELECT 'Sp6'   UNION ALL 
      SELECT 'Sp7'   UNION ALL 
      SELECT 'Sp8'   UNION ALL 
      SELECT 'Sp9'   UNION ALL 
      SELECT 'S10' 

      IF @vr_SpList IS NOT NULL 
      BEGIN 
       SET @RunSql =' INSERT INTO #FinalResult 
           SELECT ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS RNo, 
             R.SpnameList 
           FROM #TotalSPToRun R 
            INNER JOIN #RunSp L 
           ON L.SpnameList=R.SpnameList' 

       EXEC(@RunSql) 
      END 

      IF @vr_SpList IS NULL 
      BEGIN 
       SET @RunSql =' INSERT INTO #FinalResult 
           SELECT ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS RNo, 
             R.SpnameList 
           FROM #TotalSPToRun R ' 

       --PRINT @RunSql 

       EXEC(@RunSql) 
      END 

      DECLARE @SqlRun NVARCHAR(max), 
        @SpName VARCHAR(100), 
        @minID INT, 
        @maxId INT 

      SELECT @minID = Min(Rno),@maxId = Max(Rno) 
      FROM #Finalresult 

      WHILE (@minID <= @maxId) 
      BEGIN 
       SELECT @SpName = Spnamelist 
       FROM #finalresult 
       WHERE Rno = @minID 

       SET @SqlRun=N'EXECUTE ' + @SpName+' '+CAST(@i_StartYear AS VARCHAR)+','+CAST(@i_EndYear AS VARCHAR) 
       SET @[email protected] + 1 

       PRINT @SqlRun 
       EXEC(@SqlRun) 
      END 
     END try 

     BEGIN catch 
      SELECT Error_number() AS ErrorNumber, 
       Error_severity() AS ErrorSeverity, 
       Error_state()  AS ErrorState, 
       Error_procedure() AS ErrorProcedure, 
       Error_line()  AS ErrorLine, 
       Error_message() AS ErrorMessage 
     END catch 
    END 
+0

當我看到這個時,我想「真正的駭人聽聞!」。真的很可怕。 –

+0

@ Srini131-Thanku這麼多..我編輯了我的代碼..你可以檢查並幫助我如何在我的代碼中做到這一點...非常感謝你的努力.. – Catwoman

+0

@Catwoman你想傳遞這些參數值StartYear, EndYear的每一個權利是你的要求? –