sqlmetal не может извлечь udf с полным текстом - PullRequest
4 голосов
/ 08 сентября 2010

Сообщение об ошибке:

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.

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Как вы упомянули, SQLMetal нужен тип возвращаемого значения.

Другим способом решения этой проблемы является явная установка значения по умолчанию внутри хранимой процедуры:

SET @topn = COALESCE(@topn, 1000)

Бросьте это перед оператором SELECT, чтобы гарантировать, что любые параметры NULL вернут действительное значение.

Это полезно не только для SQLMetal, но и для всех, кто использует эту функцию.

0 голосов
/ 17 ноября 2011

Правильно разместил свой ответ, чтобы я мог закрыть эту ветку.

Проблема решена. Очевидно, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...