0

我正在尝试创建一个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)

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

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

我究竟做错了什么?

4

4 回答 4

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,您将消除这个潜在的问题。

于 2008-09-21T22:47:30.527 回答
0

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

于 2008-09-21T17:39:05.120 回答
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

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

于 2008-09-21T17:43:34.483 回答
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
于 2008-09-21T18:17:49.083 回答