2010-09-08 23 views
4

錯誤消息:sqlmetal失敗,全文提取UDF

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。

+0

謝謝你的男人,你救了我的命! – 2010-09-30 08:16:21

回答

0

轉貼我自己的答案正確,所以我可以關閉此線程。

問題解決了。 顯然sqlmetal運行找出返回類型的功能,但堅持提供null參數,而不是default,這似乎是sqlmetal的bug。 解決它的方法是明確聲明返回類型:

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

至於你提到的SQLMetal需要返回類型。

另一種方法來解決這個問題,就是要明確設置存儲過程中默認:

SET @topn = COALESCE(@topn, 1000)

投擲了SELECT語句之前,以確保任何NULL參數會返回一個有效的值。

這不僅是SQLMetal,但任何人誰使用這個功能很有用。