2016-03-18 44 views
0

這些都是我的班獲取多個值一個變量輸出在存儲過程中

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

存儲過程無法返回帶有子列表的對象。您可以在此處實現的最好方法是返回來自Student和Department的所有行,然後在客戶端,處理這些行並填充StudentList。 – Eugen

+0

標記dbms產品。許多產品的sp遠遠不符合ANSI SQL標準。 – jarlh

+0

您可以編寫兩個查詢來選擇學生和部門作爲單獨的表格。其餘的可以在c#中完成我的設想。 – Shanid

回答

1

你所描述的可以做到,但它是不是正常的過程。您可以使用for xml返回所有學生信息都被編碼的列。請注意,雖然這會導致所有要在單行中返回的數據,但您必須手動創建並填充所有對象。像實體框架或nHibernate這樣的ORM都不會填充你的部門和學生。事實上,你可能最終會手動解析一個字符串來創建你的學生。

今天最常見的做法是使用實​​體框架並讓它爲您完成所有工作。

下面是一些代碼,用於說明如何按照您的要求進行操作。此外,請注意,這是不推薦的,而且它是這樣做的只有一個辦法:

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做類似的事情,但如果您在此期間需要這樣做,則必須自己定製輸出。它可以完成,並不會太困難。

2

使用加入,我在這裏選擇Left 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所說,只是處理結果在你的應用程序。

+0

如果我使用連接,我將最終重複數據。我只是不想要它,我也編輯了我的問題 –

相關問題