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%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.
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.
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%Tags und Links sql sql-server stored-procedures