SQL Fehler bei der Konvertierung Fehler
-
06-07-2019 - |
Frage
wheni diese gespeicherte Prozedur aufrufen:
ALTER PROCEDURE [dbo].[GetSorted]
(
@OrderByColumn nvarchar(256)
)
AS
SET NOCOUNT ON
SELECT itDocs.AddedDate, itDocs.AddedBy FROM itDocs
ORDER BY
CASE WHEN @OrderByColumn='AddedDate' THEN itDocs.AddedDate
WHEN @OrderByColumn='AddedBy' THEN itDocs.AddedBy
END ASC
Ich erhalte Fehler:
Fehler bei der Konvertierung, wenn Datum konvertiert und / oder die Zeit von Zeichenfolge
.
Dies ist, wie ich SP nennen:
DECLARE @return_value int
EXEC @return_value = [dbo].[GetSorted]
@OrderByColumn = 'AddedBy'
SELECT 'Return Value' = @return_value
GO
UPDATE: Wenn ich Multi-Fall-Ansatz verwenden, wie in der Faust 2 Antworten vorgeschlagen, Ich bekomme Fehler, wenn hinzugefügt einem anderen Fall zur Orientierung versuchen:
ORDER BY
CASE WHEN @OrderDirection=0 THEN
CASE WHEN @OrderByColumn='AddedDate' THEN itDocs.AddedDate END ASC,
CASE WHEN @OrderByColumn='AddedBy' THEN itDocs.AddedBy END ASC
end
CASE WHEN @OrderDirection=1 THEN
Lösung
Hier ist ein guter Artikel zu erklären, welchen Fehler Sie erhalten:
Sie können Ihre gespeicherte Prozedur die folgende Änderung der CASE in der ORDER BY-Klausel, damit arbeiten (jetzt editierten um Richtung als Parameter enthalten):
ALTER PROCEDURE [dbo].[GetSorted]
(
@OrderByColumn nvarchar(256),
@OrderDirection int
)
AS
SET NOCOUNT ON
SELECT itDocs.AddedDate, itDocs.AddedBy FROM itDocs
ORDER BY
CASE WHEN @OrderByColumn='AddedDate' AND @OrderDirection=0 THEN itDocs.AddedDate END ASC,
CASE WHEN @OrderByColumn='AddedBy' AND @OrderDirection=0 THEN itDocs.AddedBy END ASC,
CASE WHEN @OrderByColumn='AddedDate' AND @OrderDirection=1 THEN itDocs.AddedDate END DESC,
CASE WHEN @OrderByColumn='AddedBy' AND @OrderDirection=1 THEN itDocs.AddedBy END DESC
Andere Tipps
Sie versuchen, Datentypen zu konvertieren und Datetime hat eine höhere Priorität. Im Grunde genommen "AddedBy = 'Bob'" kann nicht konvertiert werden ...
SELECT
itDocs.AddedDate, itDocs.AddedBy
FROM
itDocs
ORDER BY
CASE OrderByColumn WHEN 'AddedDate' THEN itDocs.AddedDate ELSE '19000101' END,
CASE OrderByColumn WHEN 'AddedBy' THEN itDocs.AddedBy ELSE '' END