DECLARE @StuBook TABLE(StuName VARCHAR(10),bName VARCHAR(30))
DECLARE Borrow_Cursor CURSOR FOR
SELECT St.sName,B.sName
FROM dbo.Students St
INNER JOIN dbo.BorrowReturn Bo WITH(NOLOCK) ON Bo.sIDNo=St.sIDNo
INNER JOIN dbo.Books B WITH(NOLOCK) ON B.sISBN=Bo.sISBN
GROUP BY St.sName,B.sName
DECLARE @BookName VARCHAR(30),@StuName VARCHAR(10),
@B VARCHAR(30),@S VARCHAR(10)
OPEN Borrow_Cursor
FETCH NEXT FROM Borrow_Cursor INTO @StuName,@BookName
SELECT @S=@StuName,@B=''
WHILE @@FETCH_STATUS = 0
BEGIN
IF @StuName=@S
SELECT @B=@B+', '+@BookName
ELSE
BEGIN
INSERT @StuBook VALUES(@S,RIGHT(@B,LEN(@B)-1))
SELECT @B=', '+@BookName,@S=@StuName
END
FETCH NEXT FROM Borrow_Cursor INTO @StuName,@BookName
END
INSERT @StuBook VALUES(@S,RIGHT(@B,LEN(@B)-1))CLOSE Borrow_Cursor
DEALLOCATE Borrow_Cursor
SELECT [姓名]=StuName,[所借书目]=bName FROM @StuBook请问一下这段语句可否优化?
感觉@StuName=@S等来等去的有点复杂
游标指向哪个字段?
DECLARE Borrow_Cursor CURSOR FOR
SELECT St.sName,B.sName
FROM dbo.Students St
INNER JOIN dbo.BorrowReturn Bo WITH(NOLOCK) ON Bo.sIDNo=St.sIDNo
INNER JOIN dbo.Books B WITH(NOLOCK) ON B.sISBN=Bo.sISBN
GROUP BY St.sName,B.sName
DECLARE @BookName VARCHAR(30),@StuName VARCHAR(10),
@B VARCHAR(30),@S VARCHAR(10)
OPEN Borrow_Cursor
FETCH NEXT FROM Borrow_Cursor INTO @StuName,@BookName
SELECT @S=@StuName,@B=''
WHILE @@FETCH_STATUS = 0
BEGIN
IF @StuName=@S
SELECT @B=@B+', '+@BookName
ELSE
BEGIN
INSERT @StuBook VALUES(@S,RIGHT(@B,LEN(@B)-1))
SELECT @B=', '+@BookName,@S=@StuName
END
FETCH NEXT FROM Borrow_Cursor INTO @StuName,@BookName
END
INSERT @StuBook VALUES(@S,RIGHT(@B,LEN(@B)-1))CLOSE Borrow_Cursor
DEALLOCATE Borrow_Cursor
SELECT [姓名]=StuName,[所借书目]=bName FROM @StuBook请问一下这段语句可否优化?
感觉@StuName=@S等来等去的有点复杂
游标指向哪个字段?
DECLARE Borrow_Cursor CURSOR FOR
SELECT St.sName,B.sName
FROM dbo.Students St
INNER JOIN dbo.BorrowReturn Bo WITH(NOLOCK) ON Bo.sIDNo=St.sIDNo
INNER JOIN dbo.Books B WITH(NOLOCK) ON B.sISBN=Bo.sISBN
GROUP BY St.sName,B.sName
DECLARE @BookName VARCHAR(30),@StuName VARCHAR(10),@B VARCHAR(30),@S VARCHAR(10)
OPEN Borrow_Cursor
FETCH NEXT FROM Borrow_Cursor INTO @StuName,@BookName --@StuName student表的sname,@BookName Books表的sname SELECT @S=@StuName,@B=''WHILE @@FETCH_STATUS = 0
BEGIN
IF @StuName=@S
SELECT @B=@B+', '+@BookName
ELSE
BEGIN
INSERT @StuBook VALUES(@S,RIGHT(@B,LEN(@B)-1))
SELECT @B=', '+@BookName,@S=@StuName
END
FETCH NEXT FROM Borrow_Cursor INTO @StuName,@BookName
ENDINSERT @StuBook VALUES(@S,RIGHT(@B,LEN(@B)-1))CLOSE Borrow_Cursor
DEALLOCATE Borrow_CursorSELECT [姓名]=StuName,[所借书目]=bName FROM @StuBook
看起来貌似是要有对应书名的学生名提取出来。
好像不用游标也可以得到。
LZ给出数据和要求的结果吧!
小李 SQL Sever 2000, 权力野兽朱元璋,
小孙 C#, Java编程思想,
小王 新概念英语(2), VB语言程序设计,
小吴 代码大全, SQL Sever 2000,
小赵 C#,
小郑 Delphi管理信息系统,
小周 线性代数, 现在要求用游标,上面语句是正确的,但是感觉有点复杂,能不能简化?
DECLARE Borrow_Cursor CURSOR FOR
SELECT St.sName,B.sName
FROM dbo.Students St
INNER JOIN dbo.BorrowReturn Bo WITH(NOLOCK) ON Bo.sIDNo=St.sIDNo
INNER JOIN dbo.Books B WITH(NOLOCK) ON B.sISBN=Bo.sISBN
GROUP BY St.sName,B.sName
DECLARE @BookName VARCHAR(100),@StuName VARCHAR(10),
@B VARCHAR(100),@S VARCHAR(10)
OPEN Borrow_Cursor
FETCH NEXT FROM Borrow_Cursor INTO @StuName,@BookName
WHILE @@FETCH_STATUS = 0
BEGIN
--DECLARE @BookName VARCHAR(8000)
SET @BookName = ''
SELECT @BookName=B.sName+', '+@BookName
FROM dbo.Students St WITH(NOLOCK)
INNER JOIN dbo.BorrowReturn Bo WITH(NOLOCK) ON Bo.sIDNo=St.sIDNo
INNER JOIN dbo.Books B WITH(NOLOCK) ON B.sISBN=Bo.sISBN
WHERE St.sName=@StuName
INSERT @StuBook VALUES(@StuName,@BookName)
FETCH NEXT FROM Borrow_Cursor INTO @StuName,@BookName
END
CLOSE Borrow_Cursor
DEALLOCATE Borrow_Cursor
SELECT DISTINCT(StuName)AS '姓名',[所借书目]=LEFT(bName,LEN(bName)-1) FROM @StuBook 看看这样行不?