首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlmetal无法使用全文提取udf

sqlmetal无法使用全文提取udf
EN

Stack Overflow用户
提问于 2010-09-08 21:04:55
回答 2查看 384关注 0票数 4

错误消息:

代码语言:javascript
复制
Warning : SQM1014: Unable to extract function 'dbo.ProductFamilyIndex_EN' from SqlServer. Null or empty full-text predicate.

函数定义为:

代码语言:javascript
复制
CREATE FUNCTION [dbo].[ProductFamilyIndex_EN]
(   
    @topn int,
    @keywords nvarchar(4000)
)
RETURNS TABLE 
AS
RETURN 
(
    select top (@topn) ProductFamilyID 
    from (

        select pf.ProductFamilyID, t.[RANK] as _rank
        from containstable(ProductFamily, (Name_EN), @keywords, LANGUAGE 'English', @topn) t
        inner join ProductFamily pf on(pf.ProductFamilyID=t.[KEY])

        union all

        select p.ProductID as ProductFamilyID, t.[RANK] as _rank
        from containstable(Product, (LongDescription_EN, ShortDescription_EN), @keywords, LANGUAGE 'English', @topn) t
        inner join Product p on(p.ProductID=t.[KEY] and p.ProductFamilyID is null and p.Deleted is null)

    ) t
    group by ProductFamilyID
    order by max(_rank) desc
)

不要被内部的联盟搞糊涂了--这只意味着一个没有家族的产品本身就是一个家族。

已尝试为参数指定默认值:

代码语言:javascript
复制
@topn int = 1000,
@keywords nvarchar(4000) = 'test'

结果是一样的。

使用.NET 3.5和sql2008。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-17 22:45:09

重新发布我自己的答案,这样我就可以关闭这个帖子了。

问题解决了。显然,sqlmetal运行该函数来确定返回类型,但坚持提供null参数而不是default,这似乎是sqlmetal的错误。解决这个问题的方法是显式声明返回类型:

代码语言:javascript
复制
alter function [dbo].[ProductFamilyIndex_EN] (@topn int, @keywords nvarchar(4000))
returns @t table (ProductFamilyID int not null)
as begin
...
return end
票数 0
EN

Stack Overflow用户

发布于 2011-08-23 00:31:27

正如您所提到的,SQLMetal需要一个返回类型。

解决此问题的另一种方法是在存储过程中显式设置默认值:

SET @topn = COALESCE(@topn, 1000)

SELECT语句之前抛出它,以确保任何NULL参数都将返回有效值。

这不仅对SQLMetal有用,而且对使用此函数的任何人都很有用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3668005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档