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/