Я создал хранимую процедуру с помощью sql server, и мне нужно подсчитать количество записей во временной таблице, созданной с помощью предложения WITH. Я использовал эту временную таблицу один раз как внутреннее соединение. Кроме того, я хочу не подсчитывать записи в этой временной таблице записей и установить это значение в переменную @SlotCount.

Я пробовал это так (имя временной таблицы - cte):

SELECT @SlotCount = COUNT(*) FROM cte

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

Хранимая процедура :

ALTER PROCEDURE [dbo].[usp_GetXXXXXXXXXXXXXXXXX]
    -- Add the parameters for the stored procedure here
    @Starttime DATETIME, 
    @Endtime DATETIME
AS
BEGIN
    
    DECLARE @SlotCount int
    
    ;WITH cte AS ( SELECT @Starttime starttime, DATEADD(MINUTE, 15, @Starttime) endtime
              UNION ALL
              SELECT endtime, DATEADD(MINUTE, 15, endtime)
              FROM cte
              WHERE endtime < @Endtime)

              --do something for count no of records in cte table and set that value to @SlotCount
            
            select count(a.AVAIL_ID),a.TEACHER_USERNAME 
            from cte c
            INNER JOIN AvailabilityDetail ad ON c.starttime = ad.StartDateTime AND c. endtime = ad.EndDateTime
            INNER JOIN AVAILABILITY a ON ad.AVAIL_ID = a.AVAIL_ID
            LEFT JOIN TEACHER_BIO b ON a.TEACHER_USERNAME = b.TEACHER_USERNAME
            WHERE ad.IsAvailable = 1
            AND ad.AvailabilityType = 'N'
            AND b.Active = 1
            AND b.IsGroupClass = 1
            AND b.HIDE_FROM_SCHEDULING = 0
            GROUP BY a.AVAIL_ID,a.TEACHER_USERNAME
            

END 


0
Roshani 16 Сен 2020 в 12:49

1 ответ

Лучший ответ

Вы можете сохранить результаты во временную таблицу, а затем вернуть ее

DECLARE @SlotCount int
;WITH cte AS ( SELECT @Starttime starttime, DATEADD(MINUTE, 15, @Starttime) endtime
              UNION ALL
              SELECT endtime, DATEADD(MINUTE, 15, endtime)
              FROM cte
              WHERE endtime < @Endtime)
                          
            select count(a.AVAIL_ID),a.TEACHER_USERNAME 
            INTO #cte from cte c
            INNER JOIN AvailabilityDetail ad ON c.starttime = ad.StartDateTime AND c. endtime = ad.EndDateTime
            INNER JOIN AVAILABILITY a ON ad.AVAIL_ID = a.AVAIL_ID
            LEFT JOIN TEACHER_BIO b ON a.TEACHER_USERNAME = b.TEACHER_USERNAME
            WHERE ad.IsAvailable = 1
            AND ad.AvailabilityType = 'N'
            AND b.Active = 1
            AND b.IsGroupClass = 1
            AND b.HIDE_FROM_SCHEDULING = 0
            GROUP BY a.AVAIL_ID,a.TEACHER_USERNAME

SELECT * FROM #cte

SET @SlotCount = (SELECT COUNT(*) FROM #cte)
0
Venkataraman R 16 Сен 2020 в 10:24