在SQL Server 2005中创建UDF时出错

时间:2008-09-21 17:35:52

标签: sql-server user-defined-functions coalesce

我正在尝试在SQL Server 2005 Express中创建一个UDF,如下所示:

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)

当我尝试按上述方法创建函数时,出现错误:

  

消息102,级别15,状态1,过程CombineValues,第10行不正确   '='附近的语法。

我做错了什么?

4 个答案:

答案 0 :(得分:1)

使用此方法时需要小心。对于此查询,这可能不会影响您,但请记住此方法的未来应用。

如果列表中包含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,您将消除这个潜在的问题。

答案 1 :(得分:0)

尝试将SELECT更改为SET,然后通过SELECT(ing)@CuisineList

结束您的功能

答案 2 :(得分:0)

Hojou,你的建议不起作用,但有类似的事情:

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

我想将此标记为答案,但由于我是提出这个问题的人,我不确定这是否合适?有什么建议?请发表意见。

答案 3 :(得分:0)

这个答案来自原始海报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