带光标的过程缺少输出
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
除非你正在聚合(你不是)。
我正在开发一个 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
除非你正在聚合(你不是)。