sqlmetal 无法提取 udf 全文

Ili*_*a G 5 sql-server full-text-search linq-to-sql

错误信息:

Warning : SQM1014: Unable to extract function 'dbo.ProductFamilyIndex_EN' from SqlServer. Null or empty full-text predicate.
Run Code Online (Sandbox Code Playgroud)

函数定义为:

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
)
Run Code Online (Sandbox Code Playgroud)

不要对内部的联合感到困惑 - 这仅仅意味着没有系列的产品本身就是一个系列。

尝试为参数指定默认值:

@topn int = 1000,
@keywords nvarchar(4000) = 'test'
Run Code Online (Sandbox Code Playgroud)

得到相同的结果。

使用.NET 3.5和sql2008。

Ili*_*a G 1

正确地重新发布我自己的答案,以便我可以关闭此线程。

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

alter function [dbo].[ProductFamilyIndex_EN] (@topn int, @keywords nvarchar(4000))
returns @t table (ProductFamilyID int not null)
as begin
...
return end
Run Code Online (Sandbox Code Playgroud)