Dynamischer Order By Part in einer SP

Beim Schreiben von Stores Procedure möchte man von Zeit zu Zeit div. Elemente dynamisch auswählen lassen. Ein gutes Beispiel dafür ist z.B. der Order By - Part einer Abfrage.

Um per Parameter dieses zu steuern hier ein Stückchen Code:

declare @order int
set @order = 3

SELECT *
FROM GaliNeo_Store_Product P LEFT JOIN GaliNeo_Store_CatProduct CP ON CP.[ProductId] = P.[ProductId]

WHERE CP.[CategoryID] = 19

order by 

    case @order
    when 'productname' then [ProductName]
    when 'productnumber' then P.[ProductNumber]
    
    else null
    end,

    case @order
    when 'productid' then P.[ProductId]
    
    else null
    end

     

Diesen Code habe ich im SQl Query Analyzer geschrieben und ausgeführt.

Das hier zwei case - Bereiche genutzt werden liegt an den unterschiedlichen Datentypen. ProductName ist ein nvarchar und ProductId ein int Datentyp. Entweder führt man eine Konvertierung durch, besser ist aber wenn man mit zwei Konstrukten arbeitet.

Eine andere Möglichkeit wäre folgende:

declare @order int
set @order = 3

SELECT *,
    case
    when @order = 1 then [ProductName]
    when @order = 2 then Convert(nvarchar,P.[Productid])
    when @order = 3 then Convert(nvarchar,P.[ProductTypeId])
    end as OrderCol
FROM GaliNeo_Store_Product P LEFT JOIN GaliNeo_Store_CatProduct CP ON CP.[ProductId] = P.[ProductId]

WHERE CP.[CategoryID] = 19

order by OrderCol

 

Kommentar schreiben