Erreur de conversion SQL
-
06-07-2019 - |
Question
Quand j’appelle cette procédure stockée:
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
Je reçois une erreur:
La conversion a échoué lors de la conversion de la date et / ou le temps de la chaîne de caractères
.
C’est ainsi que j’appelle SP:
DECLARE @return_value int
EXEC @return_value = [dbo].[GetSorted]
@OrderByColumn = 'AddedBy'
SELECT 'Return Value' = @return_value
GO
MISE À JOUR: Si j'utilise l'approche multi-cas comme suggéré dans les réponses du premier poing, Je reçois une erreur en essayant d’ajouter un autre cas d’orientation:
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
La solution
Voici un bon article expliquant l'erreur que vous recevez:
Utilisation de CASE dans la clause ORDER BY
Vous pouvez modifier votre procédure stockée comme suit pour permettre au CASE de la clause ORDER BY de fonctionner (maintenant modifié pour inclure la direction de la commande en tant que paramètre):
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
Autres conseils
Vous essayez de convertir des types de données et la date / heure a une priorité plus élevée. En gros, " AddedBy = 'bob' " ne peut pas être converti ...
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