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等来等去的有点复杂
游标指向哪个字段?

解决方案 »

  1.   

    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 --@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给出数据和要求的结果吧!
      

  2.   

    就是每位学生借的书名串联 姓名 所借书目
    小李 SQL Sever 2000,  权力野兽朱元璋,  
    小孙 C#,  Java编程思想,  
    小王 新概念英语(2),  VB语言程序设计,  
    小吴 代码大全,  SQL Sever 2000,  
    小赵 C#,  
    小郑 Delphi管理信息系统,  
    小周 线性代数,  现在要求用游标,上面语句是正确的,但是感觉有点复杂,能不能简化?
      

  3.   

    DECLARE @StuBook TABLE(StuName VARCHAR(10),bName VARCHAR(100))
    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 看看这样行不?