从sql server存储过程返回多个数据集

时间:2016-10-13 06:27:10

标签: c# asp.net sql-server stored-procedures

我需要通过Web Api返回基于调用运行5个不同查询的存储过程的Base64 XML输出。

存储过程没有编写(我需要编写)但是有5个查询,其中数据是完全不同的表和列等...所以我想知道这是否可能?

我知道在Oracle中你可以返回多个游标,但是使用SQL Server,我可以返回到asp.net 4.5(mvc c#/ Ado.net)多个数据集或集合吗?这有什么例子吗?

只有一个查询的示例

   -- Content Tab
SELECT -- vTC.[TemplateId]  
  t.Name as "Client Name and Document"  ,vTC.[SectionName] ,vTC.[ContentId] ,vTC.[ContentName]
  ,vTC.[ContentDescription],vTC.[ContentValue] ,CAL.ContentValue as "Spanish Content" , iif(S.IsClientSection = 1, 'Global Section','Template Section') as "Global or Template Section"
  ,DT.Title as DataType ,iif(vTC.IsRequired = 1, 'Yes', 'No') as "Required" ,vTC.[DisplayType] 
FROM [dbo].[vwTemplateContent] vTC
 left join dbo.Template t on vTC.TemplateId = t.TemplateId
  left join dbo.DataType DT on vTC.DataTypeId = dt.datatypeid
   left join dbo.Section S on S.SectionID = vTC.SectionID
   left join [dbo].[ContentAlternateLanguage] CAL on vTC.ContentId =    CAL.ContentID
  where vTC.templateid in (1) 
  order by DisplayOrder

3 个答案:

答案 0 :(得分:11)

如果要获得多个表,则必须在存储过程中编写多个select语句,如下所示:

CREATE PROCEDURE SPName
(
/*Declare your parameters*/
@parm1 dataType
)
AS
BEGIN
/*Write your select statements below*/
-- SELECT * FROM tblName
-- SELECT * FROM tblName2

END

您必须将这些记录填入您的DataSet,DataSet支持ADO.net中的多个表。

请参考以下代码填写您的数据集:

SqlConnection con=new SqlConnection("YourConnection String");
SqlCommand cmd=new SqlCommand();
SqlDataAdapter da=new SqlDataAdapter();
DataSet ds = new DataSet();
cmd = new SqlCommand("SPName", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@parm1", id);//if you have parameters.
da = new SqlDataAdapter(cmd);
da.Fill(ds);
con.Close();

在此之后,您可以使用

利用不同的多个记录集
ds.Tables[0]
ds.Tables[1]
..

希望它会帮助你

由于

答案 1 :(得分:2)

这是一个基本的例子:

SQL Proc:

        var connection = new SqlConnection("Your_connection_string");
        var parameters = new SqlParameter[]
        {
            new SqlParameter("ClassName", "Robotics"),       //example of string value
            new SqlParameter("IsActive", true)               //example of numeric value
        };
        var dataSet = GetDataSet(connection, "usp_getStudentsAndClasses", parameters);

        var firstTable = dataSet?.Tables?[0];   //use as any other data table...

C#功能:

DataSet

C#用法:

DataTable

请注意,它与用于单表存储过程的代码几乎相同,只是返回的数据类型是DataSet,而不是DataTableCollectionCREATE DEFINER=`root`@`localhost` PROCEDURE `EventList_SP`( in employeeId varchar(45), in groupIdArray text, in skillIdArray text, in startDate date, in endDate date ) SET @empID = employeeId; set @SQLQuery =CONCAT( "SELECT groupId,eventId,scheduleId,description,events,eventType,scheduledDate,name,designation,image,skills,duration,status, CASE WHEN scheduledDate < NOW() AND (SELECT COUNT(*) FROM event_request WHERE event_id = eventId AND employee_code =",@empID,") > 0 THEN 1 WHEN scheduledDate < NOW() AND (SELECT COUNT(*) FROM event_request WHERE event_id = eventId AND employee_code =",@empID,") = 0 THEN 0 ELSE '' END AS hasRequested, (SELECT actual_attendance_status_id FROM TJU.event_attendees_mapping WHERE scheduleId = event_schedule_id AND employee_code =",@empID,") AS attendingStatus, meetingRoom FROM EventList_View"); PREPARE stmt FROM @SQLQuery; EXECUTE stmt; DEALLOCATE PREPARE stmt; END call EventList_SP('TJU_741','','2,19', 包含TJU_741 mask

答案 2 :(得分:1)

是的,有可能。您只需编写选择查询,就可以获得DataSet中的数据。如果您只有一个选择查询,则会获得DataTable,如果您有多个选择查询(例如5),那么您将得到一个DataSet,其中包含DataTable个。这很简单。只需编写程序并享受乐趣。

修改 存储过程(伪代码)的示例如下:

create Proc Name_Of_Proc
(
   @FirstParam DataType,
   @SecondParam DataType
)
AS
Begin
   Select statement 1
   Select statement 2 
   Select statement 3 --and so on upto n.
end

您需要在数据库中执行此操作。执行此操作后,您需要使用ADO.NET从c#执行此过程。您需要使用SqlConnection SqlCommandSqlDataReader对象来执行此操作。您可以在google或SO上搜索更多示例。关于SO的一个这样的链接是How to execute Stored procedure in c#