Объединить два представления в хранимой процедуре - PullRequest
0 голосов
/ 12 апреля 2020

Я не знаю, как лучше это делать, но если мне нужна хранимая процедура для извлечения данных из нескольких представлений.

У меня есть два представления, первое из которых передает параметр CreationDate в он и второй выполняют первый с дополнительными операторами.

Что я хочу сделать, это выбрать данные для этих двух представлений из кода C#; Я использую ASP. NET Webforms, VS 2010, чтобы получить результат из второго представления после изменения CreationDate из первого просмотра.

Это выбор из первого представления, называемый 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

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Это решило мою проблему с тем, что я хочу сделать с двумя наборами представлений, мне нужно усовершенствовать эту хранимую процедуру, потому что она требует больше времени для выполнения.

Любой совет

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  
0 голосов
/ 12 апреля 2020

Я бы упаковывал каждое представление в отдельную хранимую процедуру, извлекал результаты и делал бы дальнейшую логику c в 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);
   }

}
...