【问题标题】:Combine two views in a stored procedure在存储过程中组合两个视图
【发布时间】:2020-04-12 10:25:37
【问题描述】:

我不知道这样做的最佳做法是什么,但如果我需要一个存储过程来从多个视图中获取数据。

我有两个视图,第一个将参数 CreationDate 传递给它,第二个使用附加语句执行第一个。

我要做的是从 C# 代码中从这两个视图中选择数据;在从第一个视图更改 CreationDate 后,我正在使用 ASP.NET Webforms、VS 2010 从第二个视图获取结果。

这是从名为VwInprogressSub1的第一个视图中选择的

select 
    CurrentAgentFK, 
    Count(*) as TotalLeads,
    Sum(CASE WHEN LeadTicket.leadticketstatusfk=4 THEN 1 ELSE 0 END) AS AssignedCount,
    Sum(CASE WHEN LeadTicket.leadticketstatusfk=6 THEN 1 ELSE 0 END) AS InProgressCount,
    Sum(CASE WHEN DaysToGetInProgress=0 THEN 1 ELSE 0 END) AS RespondedSameDay,
    Sum(CASE WHEN DaysToGetInProgress=1 THEN 1 ELSE 0 END) AS RespondedSecondDay,
    Sum(CASE WHEN DaysToGetInProgress=2 THEN 1 ELSE 0 END) AS RespondedThirdDay,
    Sum(CASE WHEN DaysToGetInProgress>2 THEN 1 ELSE 0 END) AS RespondedMorethanThreeDay
 from 
     leadticket
 where 
     isfullleadticket = 1 and isold = 0
     and leadticket.CreationDateLG >= 20200201
     and leadticket.CreationDateLG <= 20200229
 group by 
     CurrentAgentFK

这是从名为VwInprogress 的第二个视图中选择的:

SELECT
    dbo.VW_User.BranchFranchiseeName AS Branch,
    dbo.VW_User.UserName,
    dbo.VwInprogressSub1.TotalLeads,
    dbo.VwInprogressSub1.AssignedCount,
    dbo.VwInprogressSub1.InProgressCount,
    dbo.VwInprogressSub1.RespondedSameDay,
    dbo.VwInprogressSub1.RespondedSecondDay,
    dbo.VwInprogressSub1.RespondedThirdDay,
    dbo.VwInprogressSub1.RespondedMorethanThreeDay,
    (((((dbo.VwInprogressSub1.RespondedSameDay) * 5) +
       ((dbo.VwInprogressSub1.RespondedSecondDay) * 3) +
       ((dbo.VwInprogressSub1.RespondedThirdDay) * 2))) -
      ((dbo.VwInprogressSub1.RespondedMorethanThreeDay) * 2)) AS Score,
    dbo.Vw_AgentsInAllTeams.TeamManagerUsername
FROM
    dbo.VwInprogressSub1
INNER JOIN 
    dbo.VW_User ON dbo.VW_User.UserIdLG = dbo.VwInprogressSub1.CurrentAgentFK
LEFT JOIN 
    dbo.Vw_AgentsInAllTeams ON dbo.VW_User.UserIdLG = dbo.Vw_AgentsInAllTeams.UserPK
WHERE
    dbo.VW_User.IsApproved = 1

【问题讨论】:

  • 咳咳。 ...您到底想对这两个SELECT 语句做什么?它们是否以某种方式相关,您是否想将结果数据加入一个公共列(或一组列)?或者您还想如何在存储过程中使用这两个结果集?您需要解释更多,以便我们能够为您提供帮助....
  • @marc_s 不知何故我想在更改first viewleadticket.CreationDateLG 后显示second view 的结果
  • @marc_s 我用每个视图的名称更新了问题,以使每件事都清楚
  • CurrentAgentFK 是加入这两个结果集的唯一键关系
  • @marc_s 我的回答不清楚?

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


【解决方案1】:

我会将每个视图包装在一个单独的存储过程中,获取结果并在 C# 代码中执行进一步的逻辑。 下面介绍如何创建存储过程并打开连接、创建命令和执行存储过程。 你没有指定 ORM 框架,所以我假设你想使用 System.Data.Sqlclient 中的东西。

CREATE PROCEDURE [dbo].[StoredProcedure]
  @CreationDate INT
AS
BEGIN
   -- ... view select
END
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand("StoredProcedure", connection) { 
                           CommandType = CommandType.StoredProcedure }) {
   connection.Open();
   command.Parameters.Add(new SqlParameter("@CreationDate", creationDate));
   var reader = command.ExecuteReader();

   while (reader.Read())
   {
      // Logic depends on how are you going to store view results. DataTable? DTO?
   }
}

--编辑 进一步对话 SqlDataAdapter 方法:

using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand("StoredProcedure", connection) { 
                           CommandType = CommandType.StoredProcedure }) {
   command.Parameters.Add(new SqlParameter("@CreationDate", creationDate));

   using (var dataAdapter = new SqlDataAdapter(command)) {
      var dataTable = new DataTable();
      dataAdapter.Fill(dataTable);
   }

}

【讨论】:

  • 如果我将视图结果存储在 DataTable 中是什么逻辑
  • 和第二个 StoredProcedure 的第二个 View 将如何编写它,因为它取决于第一个
  • 当您想将结果存储在 DataTable 中时,您将在循环之前使用 DataColumns 实例化它,并且对于每个 reader.Read() 迭代,您必须调用 DataTable.NewRow()。或者,您可以使用 SqlDataAdapter。
  • 是的,我更喜欢使用 SqlDataAdapter,然后在从第一个存储过程中获得结果后,第二个存储过程将如何编写它,因为它取决于第一个存储
  • leadticket.CreationDateLG 是一个参数吗?如果是这样,您可以修改第一个视图并仅保留 isfullleadticket = 1 and isold = 0 过滤器,然后在第二个视图中添加 VwInprogressSub1.CreationDateLG
【解决方案2】:

这解决了我想要处理两组视图的问题,我需要增强此存储过程,因为执行需要更多时间。

任何建议

CREATE PROCEDURE sp_ScoreReport   
    @CreationDateFrom datetime,   
    @vCreationDateTo datetime   
AS   

    SET NOCOUNT ON;     
	SELECT
dbo.VW_User.BranchFranchiseeName AS Branch,
dbo.VW_User.UserName,
VwInprogressSub1.TotalLeads,

VwInprogressSub1.AssignedCount,
VwInprogressSub1.InProgressCount,


VwInprogressSub1.RespondedSameDay,
VwInprogressSub1.RespondedSecondDay,
VwInprogressSub1.RespondedThirdDay,
VwInprogressSub1.RespondedMorethanThreeDay,
 
(((((VwInprogressSub1.RespondedSameDay)*5)+
((VwInprogressSub1.RespondedSecondDay)*3)+
((VwInprogressSub1.RespondedThirdDay)*2)))-
((VwInprogressSub1.RespondedMorethanThreeDay)*2))


AS Score,
dbo.Vw_AgentsInAllTeams.TeamManagerUsername

FROM
(select CurrentAgentFK,Count(*) as TotalLeads,
Sum(CASE WHEN LeadTicket.leadticketstatusfk=4 THEN 1 ELSE 0 END) AS AssignedCount,
Sum(CASE WHEN LeadTicket.leadticketstatusfk=6 THEN 1 ELSE 0 END) AS InProgressCount,
Sum(CASE WHEN DaysToGetInProgress=0 THEN 1 ELSE 0 END) AS RespondedSameDay,
Sum(CASE WHEN DaysToGetInProgress=1 THEN 1 ELSE 0 END) AS RespondedSecondDay,
Sum(CASE WHEN DaysToGetInProgress=2 THEN 1 ELSE 0 END) AS RespondedThirdDay,
Sum(CASE WHEN DaysToGetInProgress>2 THEN 1 ELSE 0 END) AS RespondedMorethanThreeDay




 from leadticket

where isfullleadticket=1 and isold=0
and leadticket.CreationDateLG >= @CreationDateFrom
and leadticket.CreationDateLG <= @vCreationDateTo

group by CurrentAgentFK) as VwInprogressSub1
INNER JOIN dbo.VW_User ON dbo.VW_User.UserIdLG = VwInprogressSub1.CurrentAgentFK
left JOIN dbo.Vw_AgentsInAllTeams ON dbo.VW_User.UserIdLG = dbo.Vw_AgentsInAllTeams.UserPK
WHERE
dbo.VW_User.IsApproved = 1
	
GO  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2010-10-22
    • 2013-03-23
    • 2015-10-19
    相关资源
    最近更新 更多