/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[Sql server] Paging og cursors
Fra : Jesper Stocholm


Dato : 03-08-05 17:12

Jeg har en tabel, som jeg skal have flyttet fra én database til en anden.
Af forskellige årsager skal den igennem et .Net-lag, der trækker data ud
fra database 1, laver dem til en CSV-fil og kalder BULK INSERT på
database 2.

Mit problem er, at tabellens indhold er for stort til at det kan
håndteres direkte i hukommelsen - og derfor er jeg nødt til at trække
data ud i nogle klumper.

Til dette vil jeg gerne bruge en cursor - som jeg vil mene vil kunne gøre
det for mig - men jeg kan ikke hitte ud af det. Jeg forstiller mig, at
jeg i min SP kommer med et start-index og et antal ønskede rækker - og så
returneres disse rækker til mig.

CREATE PROCEDURE DBO.CURSORTEST
(
   @startIndex INT,
   @recordCount INT
)
AS

DECLARE mycursor CURSOR FAST_FORWARD
   FOR SELECT * FROM MyTable
OPEN mycursor
WHILE @@FETCH_STATUS = 0
BEGIN
   IF
   FETCH NEXT FROM mycursor
END

For det første troede jeg at ovenstående ville give mig hele indholdet af
min tabel som ét resultat - men den giver mit 100000 resultater af ´én
række - hvordan får jeg den til det andet?

Og ... hvordan får jeg den til at udvælge de rigtige rækker til mig?

Jeg _har_ kigget på andre muligheder end at bruge en cursor, men da jeg
hverken har et index-felt at kigge på eller praktisk mulighed for at lave
temp-tabeller, så er en cursor den eneste måde jeg kan lave det ønskede
(så vidt jeg har fundet ud af)

Kan I hjælpe mig ud af denne kattepine?



--
Jesper Stocholm
http://stocholm.dk

Japo stole sælges - http://japoarmstole.stocholm.dk

 
 
Peter Lykkegaard (03-08-2005)
Kommentar
Fra : Peter Lykkegaard


Dato : 03-08-05 17:49

"Jesper Stocholm" wrote

> Jeg har en tabel, som jeg skal have flyttet fra én database til en anden.
> Af forskellige årsager skal den igennem et .Net-lag, der trækker data ud
> fra database 1, laver dem til en CSV-fil og kalder BULK INSERT på
> database 2.
>
Sjov konstruktion

> Mit problem er, at tabellens indhold er for stort til at det kan
> håndteres direkte i hukommelsen - og derfor er jeg nødt til at trække
> data ud i nogle klumper.

Ok
>
> Til dette vil jeg gerne bruge en cursor - som jeg vil mene vil kunne gøre
> det for mig - men jeg kan ikke hitte ud af det. Jeg forstiller mig, at
> jeg i min SP kommer med et start-index og et antal ønskede rækker - og så
> returneres disse rækker til mig.
>
[snip - sp med cursor]

MSSQL 's cursor er ikke måden at gøre det på

> For det første troede jeg at ovenstående ville give mig hele indholdet af
> min tabel som ét resultat - men den giver mit 100000 resultater af ´én
> række - hvordan får jeg den til det andet?
>
> Og ... hvordan får jeg den til at udvælge de rigtige rækker til mig?

Jeg faldt over den her på et tispunkt, det ser interessant ud
http://weblogs.sqlteam.com/jeffs/archive/2004/03/22/1085.aspx

Prøv at læse denne artikel vedr principper og muligheder i paging
http://www.aspfaq.com/show.asp?id=2120
Den kommer lidt omkring også optimering etc

> Jeg _har_ kigget på andre muligheder end at bruge en cursor, men da jeg
> hverken har et index-felt at kigge på eller praktisk mulighed for at lave
> temp-tabeller, så er en cursor den eneste måde jeg kan lave det ønskede
> (så vidt jeg har fundet ud af)

Du kan lave temporære tabeller på MSSQL hvor du har din SP der leverer data
De bliver oprettet i memory og dropppet når du afslutter din SP

> Kan I hjælpe mig ud af denne kattepine?
>
Forhåbentligt

Her er lidt flere links
http://blogs.x2line.com/al/archive/2004/05/29/325.aspx
http://www.4guysfromrolla.com/webtech/072101-1.shtml
http://www.4guysfromrolla.com/webtech/062899-1.shtml
http://www.4guysfromrolla.com/webtech/070500-1.shtml


- Peter



Jesper Stocholm (03-08-2005)
Kommentar
Fra : Jesper Stocholm


Dato : 03-08-05 18:11

"Peter Lykkegaard" <peter.aghl@gmail.com> wrote in
news:42f0f584$0$85298$edfadb0f@dread16.news.tele.dk:

> "Jesper Stocholm" wrote
>
>> Jeg har en tabel, som jeg skal have flyttet fra én database til en
>> anden. Af forskellige årsager skal den igennem et .Net-lag, der
>> trækker data ud fra database 1, laver dem til en CSV-fil og kalder
>> BULK INSERT på database 2.
>>
> Sjov konstruktion

Ja, men det skyldes primært at data manipuleres undervejs og bla.
tilføjes nye data, som ikke kan nås fra databasen.

> MSSQL 's cursor er ikke måden at gøre det på
>
>> For det første troede jeg at ovenstående ville give mig hele
>> indholdet af min tabel som ét resultat - men den giver mit 100000
>> resultater af ´én række - hvordan får jeg den til det andet?
>>
>> Og ... hvordan får jeg den til at udvælge de rigtige rækker til mig?
>
> Jeg faldt over den her på et tispunkt, det ser interessant ud
> http://weblogs.sqlteam.com/jeffs/archive/2004/03/22/1085.aspx
>
> Prøv at læse denne artikel vedr principper og muligheder i paging
> http://www.aspfaq.com/show.asp?id=2120
> Den kommer lidt omkring også optimering etc
>
>> Jeg _har_ kigget på andre muligheder end at bruge en cursor, men da
>> jeg hverken har et index-felt at kigge på eller praktisk mulighed for
>> at lave temp-tabeller, så er en cursor den eneste måde jeg kan lave
>> det ønskede (så vidt jeg har fundet ud af)
>
> Du kan lave temporære tabeller på MSSQL hvor du har din SP der leverer
> data De bliver oprettet i memory og dropppet når du afslutter din SP

Jeps - men mit problem er, at jeg har pt. 83 tabeller som jeg skal lave
denne gymnastik med - og så vidt jeg kan gennemskue, så vil denne
approach betyde

1. hit ud af, hvordan den aktuelle tabels create-statement er
2. lav herefter temp tabel
3. put data over
4. træk data ud

Med +83 tabeller bliver dette et vedligeholdelsesmareridt, som jeg er
meget tilbageholdende med at skulle ud i.

.... med mindre ... kan man - givet et tabelnavn - via fx ADO trække
tabellens create-statement ud?

>> Kan I hjælpe mig ud af denne kattepine?
>>
> Forhåbentligt
>
> Her er lidt flere links
> http://blogs.x2line.com/al/archive/2004/05/29/325.aspx
> http://www.4guysfromrolla.com/webtech/072101-1.shtml
> http://www.4guysfromrolla.com/webtech/062899-1.shtml
> http://www.4guysfromrolla.com/webtech/070500-1.shtml

Mange tak ... jeg kigger på disse links.



--
Jesper Stocholm
www.stocholm.dk

Peter Lykkegaard (03-08-2005)
Kommentar
Fra : Peter Lykkegaard


Dato : 03-08-05 19:10

"Jesper Stocholm" wrote

> Jeps - men mit problem er, at jeg har pt. 83 tabeller som jeg skal lave
> denne gymnastik med

Så er det den her du skal have fat
http://weblogs.sqlteam.com/jeffs/archive/2004/03/22/1085.aspx

Dynamisk SP

- Peter




///M (04-08-2005)
Kommentar
Fra : ///M


Dato : 04-08-05 09:36

Jesper Stocholm wrote:
> Jeg forstiller
> mig, at jeg i min SP kommer med et start-index og et antal ønskede
> rækker - og så returneres disse rækker til mig.
>
> DECLARE mycursor CURSOR FAST_FORWARD
> FOR SELECT * FROM MyTable
> Og ... hvordan får jeg den til at udvælge de rigtige rækker til mig?

Jeg ved godt at det er besluttet ikke at bruge cursorere til denne løsning,
men hvis der skulle sidde en og tænke over hvordan du får din afgrænsning
med i cursoren så er det i select statement'et:

FOR SELECT * FROM MyTable where id>x and id<y


--
Mvh
///M



Peter Lykkegaard (04-08-2005)
Kommentar
Fra : Peter Lykkegaard


Dato : 04-08-05 09:50

"///M" wrote
>
> Jeg ved godt at det er besluttet ikke at bruge cursorere til denne
> løsning, men hvis der skulle sidde en og tænke over hvordan du får din
> afgrænsning med i cursoren så er det i select statement'et:
>
> FOR SELECT * FROM MyTable where id>x and id<y
>
Jow - men hvordan vil du udnytte det i forhold til cursoren?

Hvis man ønsker at lave paging vil designet sikkert også inkludere både
search/filter samt sortering
Såehh

- Peter



///M (04-08-2005)
Kommentar
Fra : ///M


Dato : 04-08-05 10:38

Peter Lykkegaard wrote:
> "///M" wrote
>>
>> Jeg ved godt at det er besluttet ikke at bruge cursorere til denne
>> løsning, men hvis der skulle sidde en og tænke over hvordan du får
>> din afgrænsning med i cursoren så er det i select statement'et:
>>
>> FOR SELECT * FROM MyTable where id>x and id<y
>>
> Jow - men hvordan vil du udnytte det i forhold til cursoren?
>
> Hvis man ønsker at lave paging vil designet sikkert også inkludere
> både search/filter samt sortering
> Såehh

Jeg snakkede jo netop heller ikke om den konkrete løsning, jvf. min
kommentar i linie 1+2
Såeh :)

--
Mvh
///M



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408921
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste