2009-05-11 21 views
4

Ich habe die folgenden SPABSTEIGEND/ASCENDING Parameter an eine gespeicherte Prozedur

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 

Jetzt ist alles, dass SP funktioniert, aber ich möchte in der Lage sein zu entscheiden, ob ich auf- oder absteigenden sortieren möchten. Ich kann wirklich keine Lösung dafür finden mit SQL und kann nichts in Google finden.

Wie Sie sehen können, habe ich den Parameter sortDirection und ich habe versucht, es auf mehrfache Weise, aber immer mit Fehlern ... Versuchte Case-Anweisungen, IF-Anweisungen usw. zu verwenden, aber es ist kompliziert durch die Tatsache, die ich einfügen möchte ein Schlüsselwort

Hilfe wird sehr geschätzt, ich habe versucht, die Dinge, die in den Sinn kommt, aber nicht in der Lage, es richtig zu machen.

Antwort

9

Sie könnten zwei Reihenfolge von Feldern verwenden:

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

Ein Fall wird als NULL beurteilen, wenn keine der Übereinstimmung, wenn Klauseln, so dass eines der beiden Felder führt für jede Zeile auf NULL zu bewerten (nicht Auswirkungen auf die Sortierreihenfolge) und der andere hat die richtige Richtung.

Ein Nachteil ist jedoch, dass Sie Ihre @sortBy CASE-Anweisung duplizieren müssen. Sie könnten dasselbe erreichen, indem Sie dynamisches SQL mit sp_executesql verwenden und je nach Parameter ein 'ASC' oder 'DESC' Literal schreiben.

+1

Dank Mann :) Es funktionierte, versuchte ich die Lösung, die Sie vorschlagen, sondern nur mit einem Gehäuse und zwei whens statt und das hat nicht funktioniert und ich kann sehen, warum, danke für die Erklärung. Ich dachte über die Ausführung der SQL, aber ich könnte fast so gut in C# dann .. bauen. Es nervt mich immer noch, dass die Sortierung muss zweimal kommen –

1

Dieser Code sehr unhandlich bekommen wird sehr schnell, wie Sie zu Doppel Nest benötigen Ihre CASE WHEN ist ... ein Satz für die Säule durch, um zu bestellen und verschachtelter Satz für Whethers es ist ASC oder DESC

Könnte besser sein, hier Dynamic SQL zu verwenden ...

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

Sie könnten es mit dynamischem SQL machen und es mit einem EXEC aufrufen. Achten Sie jedoch auf die SQL-Injektion, wenn der Benutzer die Kontrolle über die Parameter hat.

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 
Verwandte Themen