2009-05-11 4 views
4

J'ai le SP suivantDESCENTE/ASCENDING paramètre à une procédure stockée

CREATE PROCEDURE GetAllHouses 
    set @webRegionID = 2 
    set @sortBy = 'case_no' 
    set @sortDirection = 'ASC' 

    AS 
    BEGIN 

     Select 
      tbl_houses.* 
     from tbl_houses 
     where 
      postal in (select zipcode from crm_zipcodes where web_region_id = @webRegionID) 
     ORDER BY 
      CASE UPPER(@sortBy) 
        when 'CASE_NO' then case_no 
        when 'AREA' then area 
        when 'FURNISHED' then furnished 
        when 'TYPE' then [type] 
        when 'SQUAREFEETS' then squarefeets 
        when 'BEDROOMS' then bedrooms 
        when 'LIVINGROOMS' then livingrooms 
        when 'BATHROOMS' then bathrooms 
        when 'LEASE_FROM' then lease_from 
        when 'RENT' then rent 
        else case_no 
      END 
    END 
    GO 

Maintenant, tout ce que fonctionne SP, mais je veux être en mesure de choisir si je veux trier ascendant ou descendant. Je ne peux vraiment pas trouver de solution pour ça en utilisant SQL et je ne trouve rien dans google.

Comme vous pouvez le voir, j'ai le paramètre sortDirection et j'ai essayé de l'utiliser de plusieurs façons mais toujours avec des erreurs ... J'ai essayé les instructions Case, IF et ainsi de suite, mais je veux insérer un mot-clé.

aide sera très appriciated, je l'ai essayé doit des choses qui vient à l'esprit mais n'ont pas été en mesure de faire les choses.

Répondre

9

Vous pouvez utiliser deux ordres de champs:

CASE @sortDir WHEN 'ASC' THEN 
    CASE UPPER(@sortBy) 
     ... 
    END 
END ASC, 
CASE @sortDir WHEN 'DESC' THEN 
    CASE UPPER(@sortBy) 
     ... 
    END 
END DESC 

CAS évaluera la valeur NULL si aucune des clauses WHEN corrrespondance, en fait l'un des deux champs pour évaluer la valeur NULL pour chaque ligne (non affectant l'ordre de tri) et l'autre a la direction appropriée.

Un inconvénient, cependant, est que vous auriez besoin de dupliquer votre déclaration CASE @sortBy. Vous pouvez obtenir la même chose en utilisant SQL dynamique avec sp_executesql et en écrivant un littéral 'ASC' ou 'DESC' en fonction du paramètre.

+1

homme Merci :) Il a travaillé, j'ai essayé la solution que vous proposez, mais seulement avec un cas et deux whens au lieu et cela ne fonctionne pas et je peux voir pourquoi, merci pour l'explication. Je pensais aussi à l'exécution du sql, mais je pourrais presque aussi bien construire en C# alors ... ça m'embête quand même, que les choix de tri doivent venir deux fois –

1

Ce code va être très très rapidement ingérable vous devez nid votre CASE QUAND est ... un jeu pour la colonne à l'ordre par, et ensemble imbriqué pour Whethers il est ASC ou DESC

Peut-être préférable d'envisager d'utiliser SQL dynamique ici ...

DECLARE @sql nvarchar(max) 
SET @sql = ' 
     Select 
       tbl_houses.* 
     from tbl_houses 
     where 
       postal in (select zipcode from crm_zipcodes where web_region_id = ' + @webRegionID + ') ORDER BY ' 

SET @sql = @sql + ' ' + @sortBy + ' ' + @sortDirection 

EXEC (@sql) 
0

Vous pourriez le faire avec un peu de SQL dynamique et en l'appelant avec un EXEC. Méfiez-vous de l'injection SQL si l'utilisateur a un contrôle sur les paramètres.

CREATE PROCEDURE GetAllHouses 
    set @webRegionID = 2 
    set @sortBy = 'case_no' 
    set @sortDirection = 'ASC' 
    AS 
    BEGIN 
    DECLARE @dynamicSQL NVARCHAR(MAX) 

    SET @dynamicSQL = 
    ' 
    SELECT 
     tbl_houses.* 
    FROM 
     tbl_houses 
    WHERE 
     postal 
    IN 
    (
     SELECT 
      zipcode 
     FROM 
      crm_zipcodes 
     WHERE 
      web_region_id = ' + CONVERT(nvarchar(10), @webRegionID) + ' 
    ) 
    ORDER BY 
     ' + @sortBy + ' ' + @sortDirection 

    EXEC(@dynamicSQL) 

    END 
    GO 
Questions connexes