26 thg 1, 2016

Sử dụng 2 fetch next trên một sp


USE [TN_DB]
GO
/****** Object:  StoredProcedure [dbo].[sp_TaoDe2018]    Script Date: 01/26/2016 09:54:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_TaoDe2018]
@MaMon nvarchar(500) 
AS
BEGIN 
 DECLARE @CH int 
 DECLARE @monID int  
 /*chinh sua 26/01/2016*/
 /* Tao bang tam: Cau Hoi Tam */
 DECLARE @Ten nvarchar(50)
 DECLARE @CauHoi   nvarchar(max)
 /*DECLARE @MaMon nvarchar(500)*/
 DECLARE @PA1  nvarchar(max)
 DECLARE @PA2  nvarchar(max)
 DECLARE @PA3  nvarchar(max)
 DECLARE @PA4  nvarchar(max)
 DECLARE @PA5  nvarchar(max)
 DECLARE @PA6  nvarchar(max)
 DECLARE @DapAn int
 DECLARE @Stt_Mon int
 DECLARE @Mucdo int
 DECLARE @Sopa int
 /* Xong bang tam*/   
 CREATE TABLE [dbo].[#BangTamCauHoiTam]
 (
  [ID] [int] IDENTITY,
  [Stt_Mon] int NOT NULL,
  [MaMon] [Nvarchar](500)NOT NULL,
  [CauHoi]  [Nvarchar](max)NOT NULL,
  [PA1]  [Nvarchar](max)NOT NULL,
  [PA2] [Nvarchar](max)NOT NULL,
  [PA3] [Nvarchar](max) NULL,
  [PA4]  [Nvarchar](max) NULL,
  [PA5]  [Nvarchar](max) NULL,
  [PA6]  [Nvarchar](max) NULL,
  [DapAn] int NOT NULL,
  [Mucdo] int NOT NULL,
  [Sopa] int NOT NULL,
 )
 /**/
 CREATE TABLE [dbo].[#MucDo_cau] /* bảng lưu toàn bộ câu hỏi sẽ được tạo ra*/
     (
      [TongCau] nvarchar(100) NULL
      )      
 /*phần này là lấy số câu mức đọ trên đè ở bảng môn học*/
 CREATE TABLE [dbo].[#CauHoiDe]   /* bang luu  số câu của từng mức độ */
 (
  [ID] [int] IDENTITY,
  [SoCauMucDo] nvarchar(50) NULL
  )
-- http://forums.asp.net/t/1693807.aspx?Split+and+convert+string+to+Int  
/*đoạn code tách các mức độ của môn thi thành một cột nhiều hàng*/
DECLARE @SplitVal varchar(100)
SET @SplitVal= (SELECT Socau_Mucdo FROM MonHoc WHERE  (MaMon = @MaMon) ) 
;with TachCauDe as
(
 SELECT SUBSTRING(',' + @SplitVal + ',', n.Number + 1, CHARINDEX(',', ',' + @SplitVal + ',', n.Number + 1) - n.Number - 1) AS SoCau
 FROM master..spt_values As n
 WHERE n.Type = 'p' 
 AND n.Number > 0
 AND n.Number < LEN(',' + @SplitVal + ',')
 and SUBSTRING(',' + @SplitVal + ',', n.Number, 1)=','
)
/* insert vào bảng tạm để xử lý */
INSERT INTO [#CauHoiDe] (SoCauMucDo) SELECT SoCau FROM TachCauDe      
  /* tạo ra con trỏ sử dụng trong fecth next*/
  DECLARE cauhoiMon CURSOR FOR
  SELECT  ID
  FROM [#CauHoiDe]
  OPEN cauhoiMon
         
   FETCH NEXT FROM cauhoiMon INTO   @monID 
   WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @CH =  (SELECT SoCauMucDo FROM #CauHoiDe WHERE ID =  @monID)
      BEGIN         
       ;with bangtam as
        (
        SELECT TOP (@CH) Stt_mon as CauHoi
        FROM MultiChoise 
        WHERE MaMon = @MaMon AND Mucdo = @monID 
        ORDER BY NEWID()
        )           
       INSERT INTO #MucDo_cau SELECT CauHoi FROM bangtam 
      END 
    FETCH NEXT FROM cauhoiMon INTO @monID;       
   END
 CLOSE cauhoiMon
 DEALLOCATE cauhoiMon;
 
 
 /* */
 DECLARE lstcauhoi CURSOR FOR
  SELECT  TongCau
  FROM [#MucDo_cau]
 OPEN lstcauhoi
 /**/
 FETCH NEXT FROM lstcauhoi INTO @Ten
  WHILE @@FETCH_STATUS = 0
   BEGIN
    
    SET @Stt_Mon = (select Stt_Mon FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon)
    SET @MaMon = (select MaMon FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon= @MaMon)
    SET @CauHoi = (select Cauhoi FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon)
    SET @DapAn = (select DapAn FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon= @MaMon)
    SET @Mucdo = (select Mucdo FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon)
    Declare @dem int
    set @dem = 0;
    IF((select PA1 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon) IS NOT NULL)
     BEGIN
      SET @dem = @dem + 1
      SET @PA1 = (select PA1 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon)
     END
     
    IF((select PA2 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon) IS NOT NULL)
      BEGIN
       SET @dem = @dem + 1
       SET @PA2 = (select PA2 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon)
      END
    IF((select PA3 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon) IS NOT NULL)
       BEGIN
        SET @dem = @dem + 1
        SET @PA3 = (select PA3 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon)
       END
     
    IF((select PA4 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon) IS NOT NULL)
       BEGIN
        SET @dem = @dem + 1
        SET @PA4 = (select PA4 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon)
       END
     
    IF((select PA5 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon) IS NOT NULL)
       BEGIN
        SET @dem = @dem + 1
        SET @PA5 = (select PA5 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon)
       END
    IF((select PA6 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon=@MaMon) IS NOT NULL)
       BEGIN
        SET @dem = @dem + 1
        SET @PA6 = (select PA6 FROM CauHoiTam WHERE Stt_Mon = @Ten AND MaMon= @MaMon)
       END
    SET @Sopa =  @dem;
    
    BEGIN
     INSERT INTO [#BangTamCauHoiTam] (Stt_Mon,MaMon,CauHoi,PA1,PA2,PA3,PA4,PA5,PA6,DapAn,Mucdo, Sopa)
     VALUES (@Stt_Mon,@MaMon,@Cauhoi,@PA1,@PA2,@PA3,@PA4,@PA5,@PA6,@DapAn, @Mucdo,@Sopa)
    END 
    FETCH NEXT FROM lstcauhoi INTO @Ten; 
   END
  CLOSE lstcauhoi
  DEALLOCATE lstcauhoi;

SELECT * FROM [#BangTamCauHoiTam]
order by ID ASC   
                                               
 /*  SELECT  * FROM [#MucDo_cau] */
    /*đoạn code chuyển các dòng thành một dòng một cột duy nhất đây
  DECLARE @NAMES NVARCHAR(4000) 
  SELECT @NAMES = COALESCE(@NAMES + ',','') + TongCau 
  FROM [#MucDo_cau]
  SELECT @NAMES AS CauHoi  
  */      
 END /*kết thúc pro*/ 
 
 
 
 /*
 EXEC [dbo].[sp_TaoDe2018]
 @MaMon ='NLCNMacLenin   '
 */
 
abc

Sử dụng 2 fetch next trên một sp Rating: 4.5 Diposkan Oleh: http://pdunoteit.blogspot.com/