Avatar billede hairball Nybegynder
17. maj 2001 - 15:52 Der er 4 kommentarer

Dynamisk Stored Procedure

Jeg har følgende SP :

------------------------------------------------------

Alter Proc uspIntra_Get_Programs

@CategoryID int = NULL,
@ProgramID int = NULL,
@TypeID int = NULL

AS

        SELECT * FROM downloadPrograms
        WHERE
            CategoryID = @CategoryID OR
            @CategoryID IS NULL
        ORDER
            BY Title ASC

------------------------------------------------------

Hvad gør jeg hvis jeg vil gøre det jeg \"order by\" dynamisk, så jeg via et parameter bestemmer hvilket felt der skal sorteres efter ?
Avatar billede mwittrock Nybegynder
17. maj 2001 - 16:24 #1
Enten laver du forgreninger i din procedure afhængigt af parameteren:

IF (@param = \'første_sorterings_mulighed\')
  SELECT  *
  FROM    downloadPrograms
  WHERE    CategoryID = @CategoryID
  OR      @CategoryID IS NULL
  ORDER BY første_kolonne_der_skal_sorteres_efter ASC
ELSE IF (@param = \'anden_sorterings_mulighed\')
  SELECT  *
  FROM    downloadPrograms
  WHERE    CategoryID = @CategoryID
  OR      @CategoryID IS NULL
  ORDER BY anden_kolonne_der_skal_sorteres_efter ASC
ELSE IF (osv)

eller også bruger du dynamisk eksekveret SQL:

DECLARE @sql NVARCHAR(1000)
DECLARE @params NVARCHAR(500)

SET @sql = N\'SELECT * FROM downloadPrograms WHERE CategoryID = @CatID OR @CatID IS NULL ORDER BY \' + @param + \' ASC\'
SET @params = N\'@CatID INTEGER\';

EXEC sp_executesql @sql, @params, @CatID = @CategoryID

Personligt synes jeg den første mulighed er den pæneste, men det er delvis personlig preference.
Avatar billede hairball Nybegynder
17. maj 2001 - 16:27 #2
Den første mulighed er jo vanvittigt, så skal hele SQL sætningen stå der flere gange! ..

Jeg har fundet en anden løsning som er langt bedre. Men kan du svare på mit næste spørgsmål så bliver jeg glad :)

Løsning :

@OrderBy Varchar(30) = \'ProgramID\'

AS



        SELECT * FROM downloadPrograms
        WHERE
            CategoryID = @CategoryID OR
            @CategoryID IS NULL
        ORDER BY
            CASE @OrderBy WHEN \'Title\'     THEN Title END,
            CASE @OrderBy WHEN \'ProgramID\'     THEN ProgramID END
Avatar billede mwittrock Nybegynder
17. maj 2001 - 16:29 #3
Den er absolut ikke vanvittig, da det betyder at databasen har en chance for selv at optimere hvordan proceduren udføres.

Men iøvrigt en udmærket løsning du selv kom med! Opret et svar og giv dig selv pointene, så spørgsmålet kan blive lukket.
Avatar billede mwittrock Nybegynder
17. maj 2001 - 16:31 #4
Men din CASE skal måske være:

CASE @OrderBy WHEN \'Title\' THEN Title WHEN \'ProgramID\' THEN ProgramID END

?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester