Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server:Пренапишете рекурсивния CTE, за да замените опцията maxrecursion в изглед

Можете да използвате преброяване:това е базирано на набор решение, което се представя по-добре от рекурсия, когато броят на итерациите се увеличи - и се поддържа в изгледи.

Ето един подход:

select t.objectid, t.amount, dateadd(day, x.n, t.begindate) as dt
from (
    select row_number() over (order by (select null)) - 1
    from (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
    cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
) x(n)
inner join tabledatarange t
    on dateadd(day, x.n, t.begindate) <= case 
        when enddate <= convert(date, getdate()) then enddate
        else convert(date, getdate())
    end

Преброяването генерира всички числа между 0 и 999 (можете лесно да го разширите, като добавите cross join с). Използваме го, за да „умножим“ редовете на оригиналната таблица и да генерираме периода от време.

Опитах се да пренапиша частта, която обработва крайната дата. Разбирам, че не искате бъдещи дати, така че това е условието в on клауза прави.

За тези примерни данни:

ObjectId | Amount | beginDate  | endDate   
-------: | -----: | :--------- | :---------
       1 |    500 | 2020-12-28 | null      
       2 |     35 | 2019-09-26 | 2019-10-01
       3 |    200 | 2020-05-28 | 2020-06-02

Заявката връща:

objectid | amount | dt        
-------: | -----: | :---------
       1 |    500 | 2020-12-28
       1 |    500 | 2020-12-29
       1 |    500 | 2020-12-30
       1 |    500 | 2020-12-31
       2 |     35 | 2019-09-26
       2 |     35 | 2019-09-27
       2 |     35 | 2019-09-28
       2 |     35 | 2019-09-29
       2 |     35 | 2019-09-30
       2 |     35 | 2019-10-01
       3 |    200 | 2020-05-28
       3 |    200 | 2020-05-29
       3 |    200 | 2020-05-30
       3 |    200 | 2020-05-31
       3 |    200 | 2020-06-01
       3 |    200 | 2020-06-02

Демо на DB Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намеря текст в процедурите/тригерите на SQL Server?

  2. Постоянно SQL Server 80% използване на процесора

  3. TSQL проверява дали съществува конкретна последователност от редове

  4. Заявката за актуализиране на милиони редове изпълва регистъра на транзакциите

  5. Подреждане Чрез използване на параметър за името на колоната