2010-09-08 5 views
4

Message d'erreur:SQLMetal ne parvient pas à extraire udf avec plein texte

Warning : SQM1014: Unable to extract function 'dbo.ProductFamilyIndex_EN' from SqlServer. Null or empty full-text predicate. 
fonction

définie comme:

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 
) 

ne pas confondre par le syndicat à l'intérieur - qui signifie simplement qu'un produit sans une famille est une famille à part entière.

a essayé de donner des valeurs par défaut aux paramètres:

@topn int = 1000, 
@keywords nvarchar(4000) = 'test' 

avec le même résultat.

Utilisation de .NET 3.5 et sql2008.

+0

Merci, vous m'avez sauvé la vie! –

Répondre

0

Répliquant ma propre réponse correctement afin que je puisse fermer ce fil.

Problème résolu. Apparemment, sqlmetal exécute la fonction pour déterminer le type de retour, mais insiste pour fournir le paramètre null au lieu de default, ce qui semble être le bogue de sqlmetal. Façon de contourner c'est de déclarer le type de retour explicitement:

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

Comme vous l'avez mentionné, SQLMetal a besoin d'un type de retour.

Une autre façon de résoudre ce problème, est de définir explicitement votre défaut dans la procédure stockée:

SET @topn = COALESCE(@topn, 1000)

Throw que, avant la déclaration SELECT pour assurer que tous les paramètres NULL renvoie une valeur valide.

Ceci est utile non seulement pour SQLMetal, mais pour quiconque utilise cette fonction.