خطأ في إنشاء UDF في SQL Server 2005
-
02-07-2019 - |
سؤال
أحاول إنشاء UDF في SQL Server 2005 Express
على النحو التالي:
CREATE FUNCTION [CombineValues] ()
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @CuisineList VARCHAR(8000);
RETURN
(
SELECT @CuisineList = COALESCE(@CuisineList + ', ', '') +
CAST(Cuisine AS varchar(20))
FROM Cuisines
)
END
المطابخ لديها الهيكل:
CuisineID INT PK,
Cuisine VARCHAR(20)
عندما أحاول إنشاء الدالة كما هو مذكور أعلاه، أحصل على خطأ:
MSG 102 ، المستوى 15 ، الحالة 1 ، الإجراء CombineValues ، سطر 10 بناء جملة غير صحيح بالقرب من '='.
ما الخطأ الذي افعله؟
المحلول
هذه الإجابة مأخوذة من الملصق الأصلي Wild Thing.من فضلك لا تصوت عليه لأعلى أو لأسفل.
CREATE FUNCTION [CombineValues] ()
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @CuisineList VARCHAR(8000);
SELECT @CuisineList = COALESCE(@CuisineList + ', ', '') + CAST(Cuisine AS varchar(20)) FROM Cuisines;
RETURN
(
SELECT @CuisineList
)
END
نصائح أخرى
عليك أن تكون حذرا عند استخدام هذه الطريقة.قد لا يؤثر هذا عليك الآن، بالنسبة لهذا الاستعلام، ولكن يرجى وضع ذلك في الاعتبار للتطبيقات المستقبلية لهذه الطريقة.
المشكلة تحدث عندما يكون لديك قيمة NULL في القائمة الخاصة بك.عندما يحدث هذا، سوف تحصل على نتائج غير صحيحة.
على سبيل المثال، إذا كان جدولك الأصلي يبدو هكذا...
1 Blah
2 NULL
3 Foo
4 Cracker
ستعيد وظيفتك Foo، Cracker.سيتم تفويت القيمة الأولى، Blah، بواسطة استدعاء الدالة هذا.من السهل جدًا استيعاب هذا، مع تغيير طفيف في وظيفتك، مثل هذا...
CREATE FUNCTION [CombineValues] ()
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @CuisineList VARCHAR(8000);
SELECT @CuisineList = COALESCE(@CuisineList + ', ', '') +
CAST(Cuisine AS varchar(20))
FROM Cuisines
WHERE Cuisine Is Not NULL
RETURN @CuisineList
END
عن طريق اختبار NOT NULL، سيتم التخلص من هذه المشكلة المحتملة.
حاول تغيير SELECT إلى SET ثم قم بإنهاء وظيفتك عن طريق SELECT (ing) @CuisineList الخاص بك
حسنًا، لم ينجح اقتراحك، ولكن شيئًا مشابهًا نجح:
CREATE FUNCTION [CombineValues] ()
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @CuisineList VARCHAR(8000);
SELECT @CuisineList = COALESCE(@CuisineList + ', ', '') + CAST(Cuisine AS varchar(20)) FROM Cuisines;
RETURN
(
SELECT @CuisineList
)
END
أود أن أضع علامة على هذا كإجابة، ولكن بما أنني أنا من طرح هذا السؤال، فلست متأكدًا من أن هذا مناسب؟أي اقتراحات؟من فضلك لا تتردد في التعليق.