错误消息:
Warning : SQM1014: Unable to extract function 'dbo.ProductFamilyIndex_EN' from SqlServer. Null or empty full-text predicate.函数定义为:
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
)不要被内部的联盟搞糊涂了--这只意味着一个没有家族的产品本身就是一个家族。
已尝试为参数指定默认值:
@topn int = 1000,
@keywords nvarchar(4000) = 'test'结果是一样的。
使用.NET 3.5和sql2008。
发布于 2011-11-17 22:45:09
重新发布我自己的答案,这样我就可以关闭这个帖子了。
问题解决了。显然,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发布于 2011-08-23 00:31:27
正如您所提到的,SQLMetal需要一个返回类型。
解决此问题的另一种方法是在存储过程中显式设置默认值:
SET @topn = COALESCE(@topn, 1000)
在SELECT语句之前抛出它,以确保任何NULL参数都将返回有效值。
这不仅对SQLMetal有用,而且对使用此函数的任何人都很有用。
https://stackoverflow.com/questions/3668005
复制相似问题