带光标的过程缺少输出

Procedure with cursor has missing output

我正在开发一个 SQL 服务器程序,我想打印部门名称和学生姓名 类似于附加的代码段

格式应类似于附加的示例片段,并且涉及两列。学生和系表。

问题是结果 incomplete/seems 被截断了 下面是我正在使用的代码

use testDB 
go
CREATE PROCEDURE pro_depart11
AS
SET NOCOUNT ON;    
declare @depcount as int;
declare @val as int;
declare @studentN as NVARCHAR(500);
declare @dname varchar(500);

set @val = 1;
set @depcount = (select count(*) from DEPARTMENT);
PRINT '************procedure pro_department report************'

While (@val<=@depcount)
begin
  set @dname = (select DNAME from DEPARTMENT where DEPTid=@val)
  PRINT '******************'+ @dname + '*************************'
  declare getnam_cursor cursor for

  SELECT sname FROM STUDENT s inner join DEPARTMENT d on s.DEPT_ID = d.DEPTID WHERE d.DEPTID = @val 
  group by sname order by sname asc;

  open getn_cursor

  FETCH NEXT FROM getnam_cursor into @studentN
  WHILE @@FETCH_STATUS = 0    
  BEGIN
    Print  CAST(@studentN as varchar (500))
    set @val = @val + 1;
    FETCH NEXT FROM getnam_cursor into @studentN
  end

  close getnam_cursor;
  deallocate getnam_cursor;
end

到运行脚本exec pro_depart11;

我还包含了表格的片段。学生然后系表

第三个片段是我得到的结果。我不确定我的代码哪里出了问题或如何最好地修复它,非常感谢任何帮助。

下面是table/inserts

涉及的DLL/DML代码
    CREATE TABLE dbo.STUDENT
     (snum      int,
      sname     nvarchar(12),
      MAJOR     nvarchar(12),
      DEPT_ID   int,
      slevel    nvarchar(12),
      AGE       int,
      CONSTRAINT STUDENT_SNUM_pk PRIMARY KEY (SNUM));

    CREATE TABLE dbo.DEPARTMENT
      (DEPTid   int,
       DNAME    nvarchar(100),
       LOCATION nvarchar(100),

insert into dbo.STUDENT values (0418,'S.Jack','Math',2,'SO',17);
insert into dbo.STUDENT values (0671,'A.Smith','English',2,'FR',20);
insert into dbo.STUDENT values (1234,'T.Banks','ME',3,'SR',19);
insert into dbo.STUDENT values (3726,'M.Lee','Physics',4,'SO',21);
insert into dbo.STUDENT values (4829,'J.Bale','Chemistry',5,'JR',22);
insert into dbo.STUDENT values (5765,'L.Lim','CS',1,'SR',19);
insert into dbo.STUDENT values (0019,'D.Sharon','History', 4,'FR',20);
insert into dbo.STUDENT values (7357,'G.Johnson','Math', 4,'JR',19);
insert into dbo.STUDENT values (8016,'E.Cho','History',2,'JR',19);


insert into dbo.DEPARTMENT values (1,'Computer Sciences','West Lafayette');
insert into dbo.DEPARTMENT values (2,'Management','West Lafayette');
insert into dbo.DEPARTMENT values (3,'Medical Education','Purdue Calumet');
insert into dbo.DEPARTMENT values (4,'Education','Purdue North Central');
insert into dbo.DEPARTMENT values (5,'Pharmacal Sciences','Indianapolis');

第一个关键点,你不需要嵌套循环,按部门排序,并且有条件更改名称。

declare @StudentName varchar(32), @DeptName varchar(32), @OldDeptName varchar(32) = '';

declare getnam_cursor cursor for
select s.sname StudentName, d.dname DeptName
from #Student s
inner join #Department d on d.deptid = S.Dept_id
order by d.dname, s.sname asc;

open getnam_cursor;
while 1 = 1 begin    
  fetch next from getnam_cursor into @StudentName, @DeptName;
  if @@fetch_status != 0 break;
  if @OldDeptName <> @DeptName begin
    -- Ensure the line is the same length regardless of the length of the name
    print(replicate('*',18) + ' ' + @DeptName + ' ' + replicate('*',32-len(@DeptName)));
    set @OldDeptName = @DeptName;
  end;

  print(@StudentName);
end;

close getnam_cursor;
deallocate getnam_cursor;

Returns:

****************** Computer Sciences ***************
L.Lim
****************** Education ***********************
D.Sharon
G.Johnson
M.Lee
****************** Management **********************
A.Smith
E.Cho
S.Jack
****************** Medical Education ***************
T.Banks
****************** Pharmacal Sciences **************
J.Bale

其他注意事项:

  • 使用良好的布局和空格,您(以及其他人将能够轻松地遵循您的代码)。
  • 为您的代码和列名使用一致的大小写。混在一起只会让人难以阅读。
  • 当列名因 table 而唯一时,不要在列名前加上前缀,例如dname, sname - 只需使用 Name.
  • 始终明确列出要插入的列
  • 不要假设您的部门 ID 是连续的...在现实生活中它们可能不是。
  • 你不需要 group by 除非你正在聚合(你不是)。