Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Генерация заданного кол-ва строк.  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Добрый день.

Навеяно темой про Генерацию дат между двумя заданными.

Решил вот разместить свое скромное и никчемное решение по этому поводу:
Делать "[с ... по] + шаг" не стал т.к. если это понадобится то можно легко сделать снаружи, но КМК надобиться это довольно редко поэтому каждый раз заставлять сервер делать лишнюю работу - не правильно.

alter function flex_GetRows(@Count int)
returns table
as
return(
-- declare @Count int set @Count = 548 -- кол-во строк
-- функция возвращает заданное кол-во строк
select  top (@Count) row_number() over(order by @Count) NN
from      (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t0(NN)
left join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t1(NN) on @Count > 10
left join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t2(NN) on @Count > 100
left join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t3(NN) on @Count > 1000
left join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t4(NN) on @Count > 10000
left join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t5(NN) on @Count > 100000   -- 100 тыс.
left join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t6(NN) on @Count > 1000000
left join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t7(NN) on @Count > 10000000 --  10 млн.
/*order by NN*/)


ну и тест функции:
declare @TT datetime
declare @__TEMP table(NN int)

set @TT = getdate()

 insert @__TEMP(NN)
 select t.NN 
 from flex_GetRows(10000000) t -- 10 млн.

select getdate() - @TT Delta


ну и Результат - на моем хиленьком компе работает примерно 6 сек с 10 млн. записей


Так что прошу кидать в меня табуретками, критиковать или же говорить что я зря потратил пару часов своей жизни на написание бесплезного кода.(шутка).

Спасибо за внимание.

больше всего в mssql я люблю cross apply.

К сообщению приложен файл. Размер - 101Kb
26 май 16, 13:42    [19223003]     Ответить | Цитировать Сообщить модератору
 Re: Генерация заданного кол-ва строк.  [new]
Jaffar
Member

Откуда:
Сообщений: 633
ну и план

К сообщению приложен файл (flex_GetRows.sqlplan - 36Kb) cкачать
26 май 16, 13:43    [19223012]     Ответить | Цитировать Сообщить модератору
 Re: Генерация заданного кол-ва строк.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Jaffar,

http://sqlperformance.com/2013/01/t-sql-queries/generate-a-set-1
26 май 16, 13:51    [19223090]     Ответить | Цитировать Сообщить модератору
 Re: Генерация заданного кол-ва строк.  [new]
o-o
Guest
с ... по...
готовое
IF OBJECT_ID(N'dbo.GetNums', N'IF') IS NOT NULL DROP FUNCTION dbo.GetNums;
GO
CREATE FUNCTION dbo.GetNums(@low AS BIGINT, @high AS BIGINT) RETURNS TABLE
AS
RETURN
  WITH
    L0   AS (SELECT c FROM (VALUES(1),(1)) AS D(c)),
    L1   AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
    L2   AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
    L3   AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
    L4   AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
    L5   AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
    Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
             FROM L5)
  SELECT TOP(@high - @low + 1) @low + rownum - 1 AS n
  FROM Nums
  ORDER BY rownum;
GO

Itzik Ben-Gan (C)
26 май 16, 14:00    [19223167]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить