在 SQL Server 2005 中创建 UDF 时出错

Posted

技术标签:

【中文标题】在 SQL Server 2005 中创建 UDF 时出错【英文标题】:Error creating UDF in SQL Server 2005 【发布时间】:2008-09-21 17:35:52 【问题描述】:

我正在尝试在 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,过程组合值,第 10 行不正确 '=' 附近的语法。

我做错了什么?

【问题讨论】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

你的答案是正确的。将其标记为正确有助于社区找到正确的答案。 谢谢,但似乎我无法将自己的帖子掩盖为答案?也许其他人可以复制粘贴这个答案,我会标记它?还是有更好的办法?

以上是关于在 SQL Server 2005 中创建 UDF 时出错的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 标量 UDF 性能

CLR SQL Server UDF 问题

在 SQL Server 的表列中使用 UDF 作为默认值

确定用户在 SQL Server 中创建的对象

在 SQL Server 中创建审核触发器

在 SQL Server 中创建和管理全局 Procs 和 UDF 的最佳方法是啥?