Witam,
Mam następujący problem:
Chcę zrobić coś takiego, że w mojej bazie danych sql server mam wygenerowac tabele z taka ilością rekordów jaka wpisze z palca.
W C++ było cos takiego jak cin count, chodzi mi o cos podobnego jest taka mozliwosc?
Możesz napisać sobie własną procedurę, które wygeneruje losowe dane do tabeli. Ewentualnie wprowadzić losowe dane generując je po stronie aplikacji łączącej się z systemem zarządzania bazami danych.
tutaj masz opis jak wygenerować tabelę i wrzucić odpowiednią ilość rekordów za pomocą pętli WHILE
http://anonco.pl/tworzymy-swoja-testowa-baze-danych-1mln-rekordow-sql-server/
@KiK:, gdybyś powiedział, że pod wskazanym przez Ciebie linkiem jest jak korzystać z IF i WHILE, to byłoby OK. Ale pod tym linkiem jest jak NIE wrzucać do bazy 1 mln rekordów.
Takiej ilości rekordów NIE wrzuca się INSERTEM, a jeśli już to na pewno nie pojedynczym INSERTEM. Tam gdzies na obrazku widać, ile to trwało... ponad 13 minut.
Poniższe zapytanie (na #postgreSQL) wrzuca 1 mln rekordów (takich samych jak Twoje) w 4 sekundy. Tyle mogę poczekać.
insert into myTab
select id, orderdate::date, to_char(orderdate, 'ddd')::int::text || to_char(orderdate, '/yyyy') , positionsnumber from (
select
generate_series(1,1000000) id ,
generate_series('1900-01-01'::date, '2017-12-31'::date, '1 day') orderdate,
generate_series(1,20) positionsnumber
) x
limit 1000000
Coś podobnego opisałem niedawno na mikroblogu.
@Marcin.Miga: fajnie, że pokazujesz nam co potrafi postgreSQL, ale my tu w świecie MS nie mamy tak bogato ;)
@KiK nie wiem czy masz coś wspólnego z tym zalinkowanym artem, ale jego największą słabością jest to że autor nie trzyma się własnych założeń:
Pole OrderDate będzie zawierało datę zamówienia ale z przedziału od 1990-01-01 do 2017-12-31 i będziemy je nadawać od daty początkowej, zwiększając w każdym rekordzie o jeden dzień. Jak dojdziemy do daty końcowej to wracamy do daty początkowej.
Po czym skrypt dodaje od daty 1900-01-01...
Ja jednak zawsze stoje na stanowisku, że jak wchodzą pętle/kursory, to znaczy że coś poszło nie tak, SQL to język operacji na danych, a nie do pisania programów, nie mam ochoty sprawdzać ile to potrwa u mnie, ale takie zapytanie, dające dokładnie to co w/w artykule:
--to cte jest z SO: http://stackoverflow.com/questions/1393951/what-is-the-best-way-to-create-and-populate-a-numbers-table
WITH
Pass0 as (select 1 as C union all select 1), --2 rows
Pass1 as (select 1 as C from Pass0 as A, Pass0 as B),--4 rows
Pass2 as (select 1 as C from Pass1 as A, Pass1 as B),--16 rows
Pass3 as (select 1 as C from Pass2 as A, Pass2 as B),--256 rows
Pass4 as (select 1 as C from Pass3 as A, Pass3 as B),--65536 rows
Pass5 as (select 1 as C from Pass4 as A, Pass4 as B),--4,294,967,296 rows
Tally as (select row_number() over(order by C) as i from Pass5)
insert into mytab
SELECT
i id
,dateadd(d,case when i > 10227 then (i % 10227) else i end,'1989-12-31') OrderDate
,convert(varchar(2),case when i > 20 then i % 20 + 1 else i end) + '/' + convert(varchar(4),year(dateadd(d,case when i > 10227 then (i % 10227) else i end,'1989-12-31'))) OrderNumber
,case when i > 20 then i % 20 + 1 else i end OrderPositions
FROM
tally
where
i <=1000000
OPTION (MAXRECURSION 0)
Trwa 11s, nie pobiłem @Marcin.Miga, ale on ma zapewne lepszy sprzęt ;)
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.