ترتيب SQL Server حسب جملة مع قيمة المعلمة
-
23-09-2019 - |
سؤال
لقد كتبت الإجراءات المخزنة التالية. إذا لم أستخدم Else Block Order by Call ، فأنا بحاجة إلى استخدامه إذا كان لإنشاء عبارة SELECT الخاصة بي. النظام من قبل لا يعمل مع IF كتلة أخرى. هل يمكنك أن تخبرني من فضلك ماذا أفعل خطأ؟ شكرا لك مقدما!
ALTER PROCEDURE [dbo].[GetLookupItem]
-- #description Gets LookupItem
-- #tables Subscriber.Reference.LookupItem,Subscriber.Reference.LookupText,Subscriber.Reference.LookupType
-- #parameter: @LookupTypeId This parameter defines a type of lookup
-- #parameter: @LookupTextAbbreviationId This Variable decides to tie Lookup Text to Abbreviation or Full Text. Most of the cases Full text will be used.
-- #parameter: @LanguageCode To show the Lookup Text in this Language
@LookupTypeId int,
@LookupTextAbbreviationId int ,
@LanguageCode varchar(5)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @MonthType int
SET @MonthType = (SELECT Id FROM Subscriber.Reference.LookupType WHERE Name = 'Months')
IF @LookupTextAbbreviationId IS NULL
BEGIN
SELECT RLI.Id,RLT.Value
FROM Subscriber.Reference.LookupItem RLI
INNER JOIN Subscriber.Reference.LookupText RLT
ON RLI.LookupTextId = RLT.Id AND RLT.LanguageCode = @LanguageCode AND RLI.LookupTextAbbreviationId IS NULL -- LookupTextAbbreviationId will be null for full text records in Subscriber.Reference.LookupItem
WHERE RLI.LookupTypeId = @LookupTypeId
END
ELSE
SELECT RLI.Id,RLT.Value
FROM Subscriber.Reference.LookupItem RLI
INNER JOIN Subscriber.Reference.LookupText RLT
ON RLI.LookupTextAbbreviationId = RLT.Id AND RLT.LanguageCode = @LanguageCode
WHERE RLI.LookupTypeId = @LookupTypeId
ORDER BY -- Order by will change for only Months by ID
CASE @LookupTypeId
WHEN @MonthType THEN RLT.Id
END,
CASE
WHEN @LookupTypeId <> @MonthType THEN RLT.Value
END
IF (@@ERROR <> 0)
RETURN 1
ELSE
RETURN 0
END
المحلول
هل ترغب في طلب RLT.ID عندما يساوي @lookuptypeid monthtype و RLT.Value خلاف ذلك؟ ثم يجب أن تكون القضية هكذا:
ORDER BY
CASE @LookupTypeId
WHEN @MonthType THEN RLT.Id
ELSE RLT.Value
END
ومع ذلك ، إذا كان RLT.ID و RLT.VALUE ليسا نفس النوع ، فستحصل على خطأ في التحويل. إذا كان rlt.id int و rlt.value هو varchar ، فيمكنك تغيير الحالة إلى:
ORDER BY
CASE @LookupTypeId
WHEN @MonthType THEN STR(RLT.Id)
ELSE RLT.Value
END
نصائح أخرى
أعتقد أن طلبك بواسطة بناء الجملة تم خلطه - هل يعمل هذا الاستعلام؟ أم أنه يعطي خطأ في بناء الجملة؟
هل هذا ما كنت تبحث عنه؟
ORDER BY -- Order by will change for only Months by ID
CASE @LookupTypeId
WHEN @MonthType THEN RLT.Id
ELSE RLT.Value
END
لا تنتمي إلى StackOverflow