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/