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

Избиране на N реда в SQL Server

Както беше коментирано по-рано, това е, защото сте достигнали броя на редовете на sys.columns . Ето друг начин за генериране на списък с числа или това, което другите наричат ​​Numbers Table или Tally Table .

Това използва каскаден CTE s и се казва, че е най-бързият начин за създаване на таблица за изчисление:

DECLARE @Range AS INT = 7374

;WITH E1(N) AS( -- 10 ^ 1 = 10 rows
    SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally(N) AS(
    SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
    FROM E8
)
SELECT * FROM CteTally

Можете лесно да добавите друг CTE, ако имате нужда от повече от 10 000 реда.

За повече информация относно Tally Table, прочетете тази отлична статия от Джеф Модън.

За сравнения на производителността между начините за генериране на таблици за изчисление, прочетете това .

Обяснение взето от статията на Джеф:

CTE, наречен E1 (както в 10E1 за научна нотация) не е нищо повече от десет SELECT 1 's се връща като единичен набор от резултати.

E2 прави CROSS JOIN на E1 със себе си. Това връща набор от единичен резултат от 10*10 или до 100 реда. Казвам "до", защото ако функцията TOP е 100 или по-малко, CTE са достатъчно "интелигентни", за да знаят, че всъщност не е нужно да отиват по-нататък и E4 и E8 дори няма да влезе в игра. Ако TOP има стойност по-малка от 100, не всички 100 реда, които E2 е в състояние да направи ще бъде направено. Винаги ще прави достатъчно според TOP функция.

Можете да следвате от там. E4 е CROSS JOIN на E2 и ще направи до 100*100 или 10 000 реда и E8 е CROSS JOIN на E4 което ще направи повече редове, отколкото повечето хора някога ще имат нужда. Ако сте направили повече, просто добавете E16 като CROSS JOIN на E8 и променете крайния FROM клауза към FROM E16 .

Това, което е наистина невероятно в това лошо момче, е, че произвежда ZEROREADS . Абсолютно никакво, нада, нула.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получа идентификатор за вмъкване в MSSQL в PHP?

  2. Всеки израз GROUP BY трябва да съдържа поне една колона, която не е външна препратка

  3. Променете ограничение CHECK в SQL Server с помощта на T-SQL

  4. Дефиницията на SSRS отчета е по-нова от сървъра

  5. Свързване на SQL Server към PostgreSQL