Errore di conversione SQL non riuscito
-
06-07-2019 - |
Domanda
Quando chiamo questa procedura memorizzata:
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
Ottengo l'errore:
Conversione non riuscita durante la conversione della data e / o tempo dalla stringa di caratteri
.
Ecco come chiamo SP:
DECLARE @return_value int
EXEC @return_value = [dbo].[GetSorted]
@OrderByColumn = 'AddedBy'
SELECT 'Return Value' = @return_value
GO
UPDATE: Se uso l'approccio multi-case come suggerito nelle risposte del primo pugno, Ottengo un errore quando provo ad aggiungere un altro caso di orientamento:
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
Soluzione
Ecco un buon articolo che spiega l'errore che stai ricevendo:
Uso di CASE nella clausola ORDER BY
È possibile modificare la procedura memorizzata come segue per consentire il funzionamento di CASE nella clausola ORDER BY (ora modificato per includere la direzione dell'ordine come parametro):
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
Altri suggerimenti
Stai provando a convertire i tipi di dati e datetime ha una precedenza più alta. Fondamentalmente " AddedBy = 'bob' " non può essere convertito ...
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