这些是我的课程
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调用它,是否可能
答案 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做类似的事情,但如果您在此期间也喜欢这样,那么您必须自己定制输出。它可以做到,而且不会太困难。