Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Selecionando N linhas no SQL Server


Como comentado anteriormente, é porque você atingiu o número de linhas de sys.columns . Aqui está outra maneira de gerar uma lista de números ou o que os outros chamam de Numbers Table ou Tally Table .

Isso usa CTE em cascata s e é considerado a maneira mais rápida de criar uma Tabela de Tally:
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

Você pode facilmente adicionar outro CTE se precisar de mais de 10.000 linhas.

Para obter mais informações sobre o Tally Table, leia este excelente artigo por Jeff Moden.

Para comparações de desempenho entre as formas de gerar Tabelas de Tally, leia este .

Explicação retirada do artigo de Jeff:

O CTE chamado E1 (como em 10E1 para notação científica) não é nada mais que dez SELECT 1 é retornado como um único conjunto de resultados.

E2 faz um CROSS JOIN de E1 consigo mesmo. Isso retorna um único conjunto de resultados de 10*10 ou até 100 linhas. Eu digo "até" porque se a função TOP for 100 ou menos, os CTEs são "inteligentes" o suficiente para saber que não precisa ir mais longe e E4 e E8 nem entrará em jogo. Se o TOP tem um valor menor que 100, nem todas as 100 linhas que E2 é capaz de fazer será feito. Ele sempre fará o suficiente de acordo com o TOP função.

Você pode acompanhar a partir daí. E4 é um CROSS JOIN de E2 e fará até 100*100 ou 10.000 linhas e E8 é um CROSS JOIN de E4 que fará mais filas do que a maioria das pessoas jamais precisará. Se você fez mais, basta adicionar um E16 como um CROSS JOIN de E8 e altere o FROM final cláusula para FROM E16 .

O que é realmente incrível sobre esse bad boy é que ele produz ZEROREADS . Absolutamente nenhum, nada, nada.