Ошибка при сбое преобразования SQL
-
06-07-2019 - |
Вопрос
Когда я вызываю эту хранимую процедуру:
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
Я получаю сообщение об ошибке:
Ошибка преобразования при преобразовании даты и / или времени из символьной строки
.
Вот как я называю SP:
DECLARE @return_value int
EXEC @return_value = [dbo].[GetSorted]
@OrderByColumn = 'AddedBy'
SELECT 'Return Value' = @return_value
GO
Обновить: Если я использую подход с несколькими вариантами ответов, как предложено в первых 2 ответах, Я получаю ошибку при попытке добавить другой вариант для ориентации:
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
Решение
Вот хорошая статья, объясняющая ошибку, которую вы получаете:
Использование РЕГИСТРА в предложении ORDER BY
Вы можете изменить свою хранимую процедуру следующим образом, чтобы разрешить работу обращения в предложении ORDER BY (теперь отредактировано, чтобы включить направление заказа в качестве параметра):
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
Другие советы
Вы пытаетесь преобразовать типы данных, а datetime имеет более высокий приоритет.В принципе, "AddedBy = 'bob'" не может быть преобразован...
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