C# 为存储过程中的一个变量输出获取多个值
这些是我的课C# 为存储过程中的一个变量输出获取多个值,c#,sql,stored-procedures,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;} } 我需要使用存储过程将系里的所有数据与相应
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;}
}
我需要使用存储过程将系里的所有数据与相应的学生名单联系起来
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,是否可以使用join,我选择在这里,以便万一系里没有相应的学生,它仍然会被检索
SELECT d.ID
,d.Name
,s.ID
,s. Name
FROM Deparment d
LEFT JOIN Student s ON s.Department = d.ID
因此,从您的示例中,查询将返回以下结果:
ID, Name, Student ID Student Name
1 xxx 1 aa
1 xxx 2 bb
2 yyy 3 cc
假设您的存储过程将接受部门id作为参数并检索该部门下的所有学生,只需在查询中添加一个条件
WHERE d.ID = @DeptID
正如@Eugen所说,只需在应用程序中处理结果 使用join,我在这里选择,这样,如果系里没有相应的学生,它仍然会被检索
SELECT d.ID
,d.Name
,s.ID
,s. Name
FROM Deparment d
LEFT JOIN Student s ON s.Department = d.ID
因此,从您的示例中,查询将返回以下结果:
ID, Name, Student ID Student Name
1 xxx 1 aa
1 xxx 2 bb
2 yyy 3 cc
假设您的存储过程将接受部门id作为参数并检索该部门下的所有学生,只需在查询中添加一个条件
WHERE d.ID = @DeptID
正如@Eugen所说,只需在应用程序中处理结果 你所描述的是可以做到的,但这不是正常的过程。您可以使用
for xml
返回一列,在该列中对所有学生信息进行编码。请注意,虽然这会导致在一行中返回所有需要的数据,但您必须手动创建并填充所有对象。ORM类似的实体框架或nHibernate都不会同时填充您的系和学生。事实上,为了创建学生,您可能会手工解析字符串
今天最常见的做法是使用实体框架,让它为您完成所有工作
这里有一些代码来说明如何按照您的要求进行操作。再次请注意,不建议这样做,这只是一种方法:
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>
1aa1
2bb1
特别是,您可能会发现这有点沉重,2016应该能够使用JSON做类似的事情,但如果您同时希望这样做,您必须自己定制输出。这是可以做到的,也不会太难。你所描述的可以做到,但这不是正常的过程。您可以使用
for xml
返回一列,在该列中对所有学生信息进行编码。请注意,虽然这会导致在一行中返回所有需要的数据,但您必须手动创建并填充所有对象。ORM类似的实体框架或nHibernate都不会同时填充您的系和学生。事实上,为了创建学生,您可能会手工解析字符串
今天最常见的做法是使用实体框架,让它为您完成所有工作
这里有一些代码来说明如何按照您的要求进行操作。再次请注意,不建议这样做,这只是一种方法:
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>
1aa1
2bb1
特别是,您可能会发现这有点沉重,2016应该能够使用JSON做类似的事情,但如果您同时希望这样做,您必须自己定制输出。这是可以做到的,也不会太难。存储过程无法返回包含子对象列表的对象。在这里,您可以实现的最好方法是返回由DepartmentID连接的Student和Department的所有行,然后在客户端处理这些行并填写StudentList.Tag dbms产品。许多产品的sp远远不符合ANSI SQL。您可以编写两个查询来选择学生和部门作为单独的表。其余的我想可以用c#完成。是的,这是可能的,但我只想知道天气是我的问题。如果可能的话,存储过程不能返回包含子对象列表的对象。在这里,您可以实现的最好方法是返回由DepartmentID连接的Student和Department的所有行,然后在客户端处理这些行并填写StudentList.Tag dbms产品。许多产品的sp远远不符合ANSI SQL。您可以编写两个查询来选择学生和部门作为单独的表。其余的我想可以用c#完成。是的,这是可能的,但我只想知道天气是我的问题。如果可能的话,如果我使用join,我将以重复数据结束。我只是不想要它,我也编辑了我的问题。如果我使用join,我将以重复数据结束。我只是不想要它,我也编辑了我的问题