在 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章