SQL Server Bedingte Reihenfolge von

8

Ich habe eine SQL-Abfrage in SQL Server 2005, die bricht, wenn ich eine bedingte Reihenfolge einschließe. Wenn ich die Reihenfolge lösche, funktioniert die Abfrage. Wenn ich die Reihenfolge explizit nach Bedingung schreibe (z. B. Reihenfolge nach Beschreibung), funktioniert sie. Wenn ich die bedingte Reihenfolge einschließe, bekomme ich den Fehler

%Vor%

SQL Server zeigt mir nicht an, welche Codezeile diesen Fehler verursacht hat. Ich frage mich, wie ich das beheben kann, so kann ich die bedingte Reihenfolge verwenden oder Fehlerbehandlung, welche Spalte bei der Konvertierung fehlschlägt.

%Vor%     
Halcyon 29.06.2011, 16:23
quelle

5 Antworten

15

Pro der vorherigen Antwort versuchen Sie:

order by case @SortBy when 'product' then p.Description when 'vendor' then v.LongName else convert(VARCHAR(25),a.DateAdded,20)

Dies sollte Ihnen die gewünschte Sortierung geben, da die Datumszeichenfolge yyyy-mm-dd hh: mm: ss formatiert wird.

    
gibeath 29.06.2011, 16:28
quelle
11

Sie können einen Fall für jeden Datentyp verwenden:

%Vor%     
Guffa 29.06.2011 16:36
quelle
6

Bei Verwendung eines CASE Ausdrucks in ORDER BY müssen die zurückgegebenen Datentypen immer gleich sein.

Sie können nicht auswählen, was Sie wollen - INT, DATETIME, VARCHAR usw. - ohne dynamisches SQL oder irgendeine Form von Entscheidungslogik (IE: IF ) zu verwenden, um die verschiedenen Abfragen zu lösen.

In diesem Beispiel könnten Sie CAST / CONVERT verwenden, um den DATETIME-Datentyp in einen geeigneten VARCHAR zu ändern. Aber wenn Sie nicht wissen, warum das Problem auftritt, werden Sie es wahrscheinlich in Zukunft wieder tun.

    
OMG Ponies 29.06.2011 16:26
quelle
1

Ein NULL in der Liste der zu sortierenden Spalten wird ignoriert, sodass Sie sie nach Typ aufteilen können;

%Vor%

Etwas hässlich für das letzte, besser, wenn du könntest;

%Vor%     
Alex K. 29.06.2011 16:35
quelle
0

Wenn Sie Wert auf Leistung legen, möchten Sie vielleicht einen anderen Ansatz: 1. Wickeln Sie Ihre Auswahl in einem Inline-TVF 2. Verwenden Sie zwei verschiedene SELECTs, so dass sie zwei verschiedene Pläne erhalten können, die möglicherweise effizienter sind als die generischen One-Size-All-One-All-Pläne, die Sie jetzt erhalten:

%Vor%     
A-K 29.06.2011 19:02
quelle