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。
正确地重新发布我自己的答案,以便我可以关闭此线程。
问题解决了。显然 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)