为存储过程

时间:2016-03-18 07:14:21

标签: c# sql stored-procedures

这些是我的课程

Public Class Student
{
  Public int Id{get;set;}
  public string Name {get;set;}
}
Public Class Department
{
  Public int Id{get;set;}
  public string Name {get;set;}
  public IList <Student> StudentList{get;set;}
}

这些是我的表

Student Table
Id |Name |Department
-----------------
1  |aa   | 1
2  |bb   | 1
3  |cc   | 2

Department Table
ID | Name
----------
1  | xxx
2  | yyy

我需要使用存储过程

来获取部门的所有数据和相应的学生列表
CREATE PROCEDURE test
(
)
AS
BEGIN
select Id as Id,
       Name as Name,
       ----here I need all the corresponding data from student table as StudentList 
       from Department

有可能..如果是这样请帮助我。 显然我想要的是我想写另一个程序并为StudentList调用它,是否可能

2 个答案:

答案 0 :(得分:2)

使用加入,我在这里选择Left Join,以防部门没有相应的学生,仍然可以检索。

timeuuid

因此,从您的示例中,查询将返回以下结果:

SELECT d.ID
       ,d.Name
       ,s.ID
       ,s. Name 
FROM Deparment d
LEFT JOIN Student s ON s.Department = d.ID

假设您的存储过程将接受部门ID作为参数并检索该部门下的所有学生,只需在查询中添加条件

ID, Name, Student ID Student Name
1   xxx   1          aa
1   xxx   2          bb
2   yyy   3          cc

正如@Eugen所说,只需在您的应用程序中处理结果。

答案 1 :(得分:1)

您所描述的内容可以完成,但正常流程。您可以使用for xml返回编码所有学生信息的列。请注意,虽然这会导致您想要在一行中返回所有数据,但您必须手动创建并填充所有对象。 ORM的实体框架或nHibernate都不会填充您的部门和学生。事实上,您可能最终会手动解析字符串以创建学生。

今天最常见的做法是使用Entity Framework并让它为您完成所有工作。

以下是一些代码,用于说明如何按照您的要求执行操作。再次注意,不建议这样做,这只是一种方法:

create table #s (id int, name varchar(max), departmentId int);

insert into #s (id, name, departmentId)
select * from (values  (1  , 'aa', 1) ,(2  , 'bb', 1) ,(3  , 'cc', 2)
) g(id, name, departmentId);

create table #d (departmentId int, name varchar(max));
insert into #d (departmentId, name) select * from (values 
(1  , 'xxx') ,(2  , 'yyy')
)g(departmentId, name)


 select *, (select id, name, departmentId 
            from #s s where s.departmentID = d.departmentId for xml path
           )students
  from #d d 

  drop table #d 
  drop table #s;

离婚学生1 =

<row><id>1</id><name>aa</name><departmentId>1</departmentId></row>
<row><id>2</id><name>bb</name><departmentId>1</departmentId></row>

特别是,您可能会觉得这有点沉重,2016年应该可以使用JSON做类似的事情,但如果您在此期间也喜欢这样,那么您必须自己定制输出。它可以做到,而且不会太困难。