2014-03-27 133 views
0

我需要一些關於存儲過程的幫助。它包含一個運行Select查詢的循環。如果它循環三次,我得到的結果是3個表。如何將結果組合爲一個表格?將多個查詢的結果作爲SQL Server存儲過程中的一個結果結合起來

的過程如下:

CREATE PROCEDURE [dbo].[spGetRndQuestions] 
    @ExamCode Nvarchar(60) 
AS 
BEGIN 
    Declare @NosQues Int, @Catgry nvarchar(50) 

    DECLARE CategCursor CURSOR FOR 
     (Select Category From tblExamDetail Where ExamCode = @ExamCode) 

    OPEN CategCursor 

    FETCH NEXT FROM CategCursor INTO @Catgry 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @NosQues = (Select NoOfQues from tblExamDetail Where [email protected] AND [email protected]) 

     SELECT TOP(@NosQues) QM.QuestionID, QM.QuestionDesc, QM.QuestionMarks, QM.Answer1, QM.Answer2, QM.Answer3, QM.Answer4 FROM tblQuestionMaster QM 
      INNER JOIN tblExamMaster EM ON QM.Dept = EM.Dept AND QM.Location = EM.Location AND QM.QuesModule = EM.ExamModule 
       Where [email protected] AND QM.Category [email protected] 
       Order by NEWID() 

     /*SELECT TOP (@NosQues) QuestionID,QuestionDesc,Answer1,Answer2,Answer3,Answer4,QuestionMarks from [dbo].[tblQuestionMaster] Where [email protected] AND 
     Order by NEWID() */ 

     FETCH NEXT FROM CategCursor INTO @Catgry 
    END 
CLOSE CategCursor 
DEALLOCATE CategCursor 
END 

謝謝你的幫助是真正的讚賞。

回答

2

在返回表的適當結構的SP開始處創建表變量。在每次迭代中將選定的數據插入到該表中。取消分配光標後,從該表中選擇。

CREATE PROCEDURE [dbo].[spGetRndQuestions] 
@ExamCode Nvarchar(60) AS 
BEGIN 
    Declare @NosQues Int, @Catgry nvarchar(50) 

    DECLARE @tbl TABLE(QuestionID int, QuestionDesc ....) 

    DECLARE CategCursor CURSOR FOR (Select Category From tblExamDetail Where [email protected]) 
    OPEN CategCursor 
    FETCH NEXT FROM CategCursor INTO @Catgry 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @NosQues = (Select NoOfQues from tblExamDetail Where [email protected] AND [email protected]) 

     INSERT INTO @tbl 
     SELECT TOP(@NosQues) QM.QuestionID, QM.QuestionDesc, QM.QuestionMarks, QM.Answer1, QM.Answer2, QM.Answer3, QM.Answer4 FROM tblQuestionMaster QM 
      INNER JOIN tblExamMaster EM ON QM.Dept = EM.Dept AND QM.Location = EM.Location AND QM.QuesModule = EM.ExamModule 
       Where [email protected] AND QM.Category [email protected] 
       Order by NEWID() 

     /*SELECT TOP (@NosQues) QuestionID,QuestionDesc,Answer1,Answer2,Answer3,Answer4,QuestionMarks from [dbo].[tblQuestionMaster] Where [email protected] AND 
     Order by NEWID() */ 

     FETCH NEXT FROM CategCursor INTO @Catgry 
    END 
CLOSE CategCursor 
DEALLOCATE CategCursor 

SELECT * FROM @tbl 
END 
+0

非常感謝哈姆雷特,這很有魅力。非常感謝您的幫助。 –

0

哈姆雷特確實回答了這個問題。但是,您發佈的查詢可以進行優化以消除對遊標或表變量的需求。下面的代碼應該很好地做到這一點:

CREATE PROCEDURE [dbo].[spGetRndQuestions] 
    @ExamCode Nvarchar(60) 
AS 

SELECT 
    --A.[category], 
    B.* 
FROM tblExamDetail A 
CROSS APPLY (
    SELECT TOP (A.[NoOfQues]) 
     QM.QuestionID,QM.QuestionDesc,QM.QuestionMarks, 
     QM.Answer1,QM.Answer2,QM.Answer3,QM.Answer4 
    FROM tblQuestionMaster QM 
    INNER JOIN tblExamMaster EM 
    ON QM.Dept = EM.Dept 
     AND QM.Location = EM.Location 
     AND QM.QuesModule = EM.ExamModule 
    WHERE EM.ExamCode = A.[ExamCode] 
     AND QM.Category = A.[Category] 
    ORDER BY NEWID() 
) B 
WHERE A.[ExamCode] = @ExamCode 
相關問題