在SQL Server 2005中创建UDF时出错

时间:2020-03-06 14:30:39  来源:igfitidea点击:

我正在尝试在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)

当我尝试如上所述创建函数时,出现错误:

Msg 102, Level 15, State 1, Procedure CombineValues, Line 10 Incorrect
  syntax near '='.

我究竟做错了什么?

解决方案

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

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

我想将此标记为答案,但是由于我是问这个问题的人,所以我不确定这是否合适?有什么建议?请感到有评论的感觉。

答案来自原始海报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,我们将消除此潜在问题。