سؤال

أحاول إنشاء 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

أود أن أضع علامة على هذا كإجابة، ولكن بما أنني أنا من طرح هذا السؤال، فلست متأكدًا من أن هذا مناسب؟أي اقتراحات؟من فضلك لا تتردد في التعليق.

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