يعطيني بيان حالة خادم Sql أخطاء في الوظيفة المحددة من قبل المستخدم

StackOverflow https://stackoverflow.com/questions/302833

  •  08-07-2019
  •  | 
  •  

سؤال

أرغب في استخدام بيان الحالة في الوظائف المحددة من قبل المستخدم لأنني بحاجة إلى مطابقة عدد من المصطلحات.يمكنني استخدام جدول للمطابقات ولكن بعد ذلك لن أتمكن من وضعه داخل تعريف العمود المحسوب.

يعمل هذا مع عبارات IF:

CREATE FUNCTION MaraSizeNumber
(
    @ms varchar
)
RETURNS varchar
AS
BEGIN
    IF ms = '16-18' RETURN '1'
    ELSE IF ms = '18-20' RETURN '2'
    ELSE IF ms = '20-22' RETURN '3'
    ELSE IF ms = '22+' RETURN '4'
    ELSE IF ms = '24+' RETURN '5'
    ELSE IF ms = '14-16' RETURN '7'
    ELSE RETURN 'BAD'
END

ولكن مع النمط الأصلي الذي يستخدم حالة...عند الحظر، تظهر لي رسالة خطأ.

CREATE FUNCTION MaraSizeCaseExample
(
    @ms varchar
)
RETURNS varchar
AS
BEGIN
    CASE ms
        WHEN '16-18' THEN RETURN '1'
        WHEN '18-20' THEN RETURN '2'
        WHEN '20-22' THEN RETURN '3'
        WHEN '22+' THEN RETURN '4'
        WHEN '24+' THEN RETURN '5'
        WHEN '14-16' THEN RETURN '7'
        ELSE RETURN 'BAD'
    END
END 

أحصل على خطأ في بناء جملة غير صحيح بالقرب من حالة الأحرف وبناء جملة غير صحيح بالقرب من الأجزاء الخاصة بي.

لقد قمت بتجميع كل شيء بشكل صحيح لأن كتلة CREATE FUNCTION الأخيرة الخاصة بي تنتهي بـ GO، ووفقًا للوثائق الموجودة في CASE، لدي بناء الجملة الصحيح.

لدي وظيفة عددية أكبر أقوم بإنشائها والتي ستستخدم الوظائف العددية الأخرى لإنشاء ترميز الإنتاج في نظامنا المتوافق مع المعلمات الأخرى.سيكون من الأفضل أن تكون قادرًا على استخدام CASE لأن ترميز الإنتاج يعتمد على المنتج والعميل.

أحصل أيضًا على خطأ إضافي في المثال الثاني في سطر "إنشاء دالة" الخاص بي والذي يقول، "بناء جملة غير صحيح:يجب أن يكون "إنشاء وظيفة" هو البيان الوحيد في المجموعة"، ولكن مع تطابق كل شيء آخر، لا أتلقى هذا الخطأ مع IFs.

ما الخطأ الذي أفعله، أم أن الحالات مسموح بها فقط في استعلامات SQL بدلاً من الوظائف العددية؟تأتي رسائل الخطأ من نظام رسائل الخطأ المتعرج الخاص بـ SQL Server Management Studio.

هل كانت مفيدة؟

المحلول

والبيان القضية يجب أن تبدو:

RETURN CASE @ms
       WHEN '16-18' THEN '1'
       WHEN '18-20' THEN '2'
       WHEN '20-22' THEN '3'
       WHEN '22+' THEN '4'
       WHEN '24+' THEN '5'
       WHEN '14-16' THEN '7'
       ELSE 'BAD'
  END

نصائح أخرى

أعتقد أن مشكلتك ترجع إلى أنك لا تحدد الحجم في varchar الخاص بك (والذي يكون افتراضيًا 1).وهذا يؤدي إلى اقتطاع المدخلات والمخرجات إلى حرف واحد.(كنت أيضًا في عداد المفقودين @ على المتغير الخاص بك داخل الوظيفة.)

لذا PRINT dbo.SizeExample('16-18') سوف طباعة 'B' (وهذا ليس فقط مقتطعًا، بل إنه أيضًا ليس الإجابة التي ربما تريدها، وهي '1')

حاول بدلاً من ذلك:

CREATE FUNCTION MaraSizeExample
(
    @ms varchar(5)
)
RETURNS varchar(3)
AS
BEGIN
    RETURN CASE @ms
        WHEN '16-18' THEN '1'
        WHEN '18-20' THEN '2'
        WHEN '20-22' THEN '3'
        WHEN '22+' THEN '4'
        WHEN '24+' THEN '5'
        WHEN '14-16' THEN '7'
        ELSE 'BAD'
    END
END
  1. CASE هو مجرد تعبير تم البحث عنه (أو بحث) - لا يمكنك ذلك RETURN من داخله - إنه يشبه إلى حد ما IIF() في VB أو IF() في اكسل.الإجابة السابقة أوضحت ذلك بشكل أساسي.

  2. VARCHAR وسائل VARCHAR(1), ، لذلك سوف تحصل على الاقتطاع - أي.لن ترى أبدًا 'BAD' الخروج، فقط 'B'.لست متأكدًا من سبب عدم تلقيك تحذيرًا بالاقتطاع عندما يحدث ذلك مثلًا SQL INSERT, ، ولكن هناك تذهب.

  3. @ms هو اسم المتغير الخاص بك.لست متأكدًا من سبب قبول MS ما لم يكن هناك كائن قاعدة بيانات آخر بهذا الاسم (جدول؟) - وحتى ذلك الحين لن يكون كذلك.جميع المتغيرات والمعلمات في T-SQL مسبوقة بـ @ مثله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top