/ 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
[MSSQL 2k] Select TOP x FROM Table
Fra : Jesper Stocholm


Dato : 12-10-04 07:24

Jeg har behov for at lave en stored procedure, der henter et antal rækker
ud fra en tabel. Jeg vil gerne på afviklingstidspunktet kunne bestemme hvor
mange, der trækkes ud.

Jeg troede egentlig, at jeg kunne gøre det som

CREATE PROCEDURE MyProc

@rowCountMax_ INT

AS

SELECT TOP @rowCountMax_ * FROM Table

.... men compileren accepterer det ikke.

Findes der ikke en måde at gøre det på, så jeg dynamisk kan bestemme
antallet af udtrukne rækker?

--
Jesper Stocholm http://stocholm.dk

Programmer's code comment:
//It probably makes more sense when you're stoned.

 
 
///JJ (12-10-2004)
Kommentar
Fra : ///JJ


Dato : 12-10-04 07:37

Jesper Stocholm wrote:
> Jeg har behov for at lave en stored procedure, der henter et antal
> rækker ud fra en tabel. Jeg vil gerne på afviklingstidspunktet kunne
> bestemme hvor mange, der trækkes ud.
>
> Jeg troede egentlig, at jeg kunne gøre det som
> SELECT TOP @rowCountMax_ * FROM Table

> Findes der ikke en måde at gøre det på, så jeg dynamisk kan bestemme
> antallet af udtrukne rækker?

Det kan godt være der findes en mere elegant måde men du kan gøre følgende:

declare @tmp varchar(250)
set @tmp='SELECT TOP ' + @rowCountMax + ' * FROM Table'
exec(@tmp)

PS. Du skal muligvis konvertere @rowCountMax til en varchar (fx. med
convert) inden den godtager det.

--
Mvh
///JJ



Jesper Stocholm (12-10-2004)
Kommentar
Fra : Jesper Stocholm


Dato : 12-10-04 08:14

///JJ wrote:

> Jesper Stocholm wrote:
>> Jeg har behov for at lave en stored procedure, der henter et antal
>> rækker ud fra en tabel. Jeg vil gerne på afviklingstidspunktet kunne
>> bestemme hvor mange, der trækkes ud.
>>
>> Jeg troede egentlig, at jeg kunne gøre det som
>> SELECT TOP @rowCountMax_ * FROM Table
>
>> Findes der ikke en måde at gøre det på, så jeg dynamisk kan bestemme
>> antallet af udtrukne rækker?
>
> Det kan godt være der findes en mere elegant måde men du kan gøre
> følgende:
>
> declare @tmp varchar(250)
> set @tmp='SELECT TOP ' + @rowCountMax + ' * FROM Table'
> exec(@tmp)

Problemet i dette er, at denne stored procedure er ekstremt performance-
kritisk, så jeg vil være meget ked af at bygge en SQL-streng op og
afvikle den eksplicit - dvs fordelene ved precompilering og udarbejdelse
af queryplan går fløjten.

Jeg har kigget lidt rundt og fundet ud af, at jeg kan sætte en ROWCOUNT
inden udtrækket. Men det ser ikke ud til, at det kan hjælpe mig i dette
tilfælde.

Mit problem er:

Jeg har en tabel som

Felt1 | Felt2 | ID |
-----------------------
1 bla 1
2 bla 2
null bla 3
3 bla 4
null bla 5

Jeg skal udtrække alle rækker, hvor Felt1 ikke er null, og dertil fx max
1000 rækker af "resten".

Jeg har lavet et udkast til SQL som

(
SELECT Felt1, Felt2, Felt3 FROM Table WHERE Felt1 IS NOT NULL
)
UNION
(
SELECT TOP 1000 Felt1, Felt2, Felt3 FROM Table WHERE Felt1 IS NULL
)
ORDER BY Felt1 DESC, Felt2 DESC

Dette vil sådan set virke, men jeg har nu problemer med at få flettet

SET ROWCOUNT @rowCountMax_

ind, da det vil påvirke hele forespørgslen - og ikke kun den sidste del-
forespørgsel.

Umiddelbart vil jeg jo gerne undgå at lave to SQL-forespørgsler - og
herefter manipulere resultatet i mit applikationslag - men jeg kan ikke
se løsningen nogen steder.



--
Jesper Stocholm http://stocholm.dk

Programmer's code comment:
//It probably makes more sense when you're stoned.

Peter Lykkegaard (12-10-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 12-10-04 08:24

"Jesper Stocholm" wrote

> Jeg har behov for at lave en stored procedure, der henter et antal rækker
> ud fra en tabel. Jeg vil gerne på afviklingstidspunktet kunne bestemme
> hvor
> mange, der trækkes ud.
>
Måske den her kan være til inspiration?

Paging through Records using a Stored Procedure
http://www.4guysfromrolla.com/webtech/062899-1.shtml

- Peter



Søg
Reklame
Statistik
Spørgsmål : 177460
Tips : 31964
Nyheder : 719565
Indlæg : 6408201
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste