Marcus Kramer Ответов: 1

Запрос TSQL не возвращает ожидаемых результатов


Текущий вопрос, который у меня есть, вызывает у меня сегодня горе. Для любого результирующего набора, который меньше или равен 2810 строкам, запрос работает, но, похоже, он отключает обработку при этом количестве строк.

Я что-то упускаю в том, как это работает?
DECLARE @fromDate DATE
DECLARE @toDate DATE

SET @fromDate = '2007-09-04'
SET @toDate = '2016-06-28'

SELECT DATEADD(DAY, nbr - 1, @FromDate), nbr -1, DATEDIFF(DAY, @FromDate, @ToDate)
FROM   (
          SELECT  ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS nbr
          FROM sys.columns c
       ) nbrs
WHERE nbr - 1 <= DATEDIFF(DAY, @FromDate, @ToDate)


Что я уже пробовал:

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

1 Ответов

Рейтинг:
6

Richard Deeming

То sys.columns таблица содержит строку для каждого столбца в каждой таблице вашей базы данных. Если ваш запрос не даст больше 2810 строк, это означает, что у вас есть только 2810 столбцов, определенных в вашей базе данных.

Есть различные способы решить эту проблему. Я был бы склонен использовать решение Кристиана грауса:
В SQL волшебства Часть восьмая - столы вяжутся [^]

WITH E1(N) AS 
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
    -- 1*10^1 or 10 rows
),
E2(N) AS 
(
    SELECT 1 
    FROM E1 a, E1 b
     -- 1*10^2 or 100 rows
),
E4(N) AS 
(
    SELECT 1 
    FROM E2 a, E2 b
     -- 1*10^4 or 10000 rows
),
E8(N) AS 
(
    SELECT 1 
    FROM E4 a, E4 b
     -- 1*10^8 or 100000000 rows
),
E(N) AS
(
    SELECT Row_Number() OVER (ORDER BY n) 
    FROM E8
)
SELECT 
    DateAdd(day, N - 1, @FromDate), 
    N - 1, 
    DateDiff(day, @FromDate, @ToDate)
FROM
    E
WHERE 
    N < DateDiff(day, @FromDate, @ToDate)
;


Marcus Kramer

Спасибо, Ричард. Я совершенно забыл о методе подсчета таблиц.