2011-08-24 63 views
0

一個PROC我有表名爲my_table與此架構:撥打光標

+----+--------------------------+-----------------------------+--------------------+ 
| ID | name (4 possible values) | action (2 possible values) | sequence (1,2...n) | 
+----+--------------------------+-----------------------------+--------------------+ 

我想創建一個存儲過程,可以根據從sequence列的順序處理數據。此存儲過程應查看sequence中的值,然後執行相應的存儲過程。目前我有8個獨立的存儲過程。

例如,如果seq = 1則應執行存儲過程#1。 如果seq = 2取決於nameaction的值,它將轉到存儲過程#4。有8個可能的匹配。

這裏是我的嘗試:

SET NOCOUNT ON 
DECLARE @name varchar(20), @action varchar(20), @ID int, @Seq varchar(20) 
DECLARE ILOOP CURSOR FOR SELECT ID, Name, Action, Seq FROM my_table 
OPEN ILOOP 
FETCH NEXT FROM iloop INTO @ID, @name, @Action, @Seq 
WHILE @@Fetch_Status = 0 BEGIN 
    SELECT * From my_table WHERE Name = case Name when 'provider' 
    then EXEC sp1 
END 
CLOSE ILOOP 
DEALLOCATE ILOOP 
RETURN 
+0

爲什麼,如果seq = 2,它不會去存儲過程2嗎? –

+0

不,不一定,它取決於名稱和操作列。說只有當name = c和action = Y時它纔會進入proc2。 –

+0

那麼你是否想弄清楚你的調用邏輯,或者如何讓存儲過程自己調用? –

回答

1

你忘了告訴我們有關選擇他們採取的存儲過程或什麼參數的具體邏輯什麼,但似乎你需要的東西沿着這些路線。

SET NOCOUNT ON 

DECLARE @Name VARCHAR(20) , 
    @Action VARCHAR(20) , 
    @ID INT , 
    @Seq VARCHAR(20) 

DECLARE ILOOP CURSOR 
FOR 
    SELECT ID , 
      Name , 
      Action , 
      Seq 
    FROM my_table 
    ORDER BY Seq 

OPEN ILOOP 
FETCH NEXT FROM ILOOP INTO @ID, @Name, @Action, @Seq 
WHILE @@Fetch_Status = 0 
    BEGIN 
     IF @Name = 'A' 
      AND @Action = 'X' 
      EXEC sp1 @Action, @ID, @Name 
     ELSE 
      IF @Name = 'C' 
       AND @Action = 'Y' 
       EXEC sp2 @Action, @ID, @Name 

     FETCH NEXT FROM ILOOP INTO @ID, @Name, @Action, @Seq  
    END 
CLOSE ILOOP 
DEALLOCATE ILOOP 
+0

它應按序列順序處理,並根據列名和操作調用不同的過程(8中的任何一個)。所以從seq 1開始,如果name = a和action = X,則調用proc1。如果name = C,action = Y,那麼調用proc 2等等。總共有8種可能的情況。 –

+0

OK,只需要一個ORDER BY對select和布爾條件的改變。見編輯的答案。 –