فشل تحويل 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
أحصل على الخطأ:
Conversion failed when converting date and/or time from character string
.
هذه هي الطريقة التي أسميها SP:
DECLARE @return_value int
EXEC @return_value = [dbo].[GetSorted]
@OrderByColumn = 'AddedBy'
SELECT 'Return Value' = @return_value
GO
تحديث: If I use multi-case approach as suggested in fist 2 answers, I get error when trying to added another case for 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
المحلول
إليك مقالة جيدة تشرح الخطأ الذي تتلقاه:
استخدام الحالة في جملة 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
نصائح أخرى
أنت تحاول تحويل أنواع البيانات والتاريخ والوقت له أسبقية أعلى.في الأساس، لا يمكن تحويل "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
لا تنتمي إلى StackOverflow