26 thg 10, 2015

một thí dụ nữa về FECTH NEXT sử dụng random ngẫu nhiên tạo ra một chuỗi câu hỏi


USE [TN_DB]
GO
/****** Object:  StoredProcedure [dbo].[sp_NgauNhienFETCH_NEXT]    Script Date: 11/17/2015 07:43:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_NgauNhienFETCH_NEXT]
@MaMon nvarchar(50)
AS
BEGIN 
 DECLARE @CH int 
 DECLARE @monID int  
 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; 
                                               
 /*  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_NgauNhienFETCH_NEXT]
 @MaMon ='NLCNMacLenin   '
 */
  
viết thêm các trường hợp sau nhé: * insert câu ngẫu nhiên vào baithitam * select toàn bộ nội dung vào bài thi của sinh viên

một thí dụ nữa về FECTH NEXT sử dụng random ngẫu nhiên tạo ra một chuỗi câu hỏi Rating: 4.5 Diposkan Oleh: http://pdunoteit.blogspot.com/