يعطيني بيان حالة خادم Sql أخطاء في الوظيفة المحددة من قبل المستخدم
-
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
CASE
هو مجرد تعبير تم البحث عنه (أو بحث) - لا يمكنك ذلكRETURN
من داخله - إنه يشبه إلى حد ماIIF()
في VB أوIF()
في اكسل.الإجابة السابقة أوضحت ذلك بشكل أساسي.VARCHAR
وسائلVARCHAR(1)
, ، لذلك سوف تحصل على الاقتطاع - أي.لن ترى أبدًا'BAD'
الخروج، فقط'B'
.لست متأكدًا من سبب عدم تلقيك تحذيرًا بالاقتطاع عندما يحدث ذلك مثلًاSQL
INSERT
, ، ولكن هناك تذهب.@ms
هو اسم المتغير الخاص بك.لست متأكدًا من سبب قبول MS ما لم يكن هناك كائن قاعدة بيانات آخر بهذا الاسم (جدول؟) - وحتى ذلك الحين لن يكون كذلك.جميع المتغيرات والمعلمات فيT-SQL
مسبوقة بـ@
مثله.