Недопустимый параметр полнотекстового запроса для строки полного текста

Я использую полнотекстовый поиск с LINQ в своем приложении, и поскольку это не поддерживается LINQ, я использую обходную функцию с табличной функцией. Эта функция создается на SQL Server 2008.

Удивительно, но я получаю ошибку "Полнотекстовый параметр запроса для строки полного текста недопустим" при поиске простого текста, например. "Менеджер"

Я использовал SQL Server Profiler и обнаружил, что LINQ генерировал параметр как nvarchar (4000) вместо nvarchar (250), который находится в моей функции.

Самое большое удивление появилось, когда я изменил свою функцию SQL Server, поэтому он принимает параметр как nvarchar (4000) вместо nvarchar (250), и проблема решена.

Я также играл, чтобы изменить параметр на nvarchar (2000) и меньше, но это также не сработало.

Кто-нибудь знает, почему так происходит?

Обновлено 18 ноября 2013 года - Хорошие новости и плохие новости

Хорошие новости. Я использую Entity Framework 6 для этого конкретного примера, и больше не нужно использовать nvarchar (4000)

Плохая новость - вместо этого вы должны использовать nvarchar (max): - (

Ответ 2

В моем случае мне пришлось заставить JAVA вызывать мою таблицу-значение-функцию с соответствующим типом данных, как показано ниже

query.setParameter(0, variable, new **StringNVarcharType**()  )

Ответ 3

Вам нужно убедиться, что размер переменных varchar (или nvarchar) одинаковый в вашей sql-функции и где они объявлены.

В моем случае у меня была функция, объявившая переменную как nvarchar (100), но хранимую процедуру, которая вызвала функцию, объявленную переменную, переданную как nvarchar (200). Изменение функции будет таким же, как переменная хранимой процедуры, зафиксировала это.

В приведенном ниже коде показан нерабочий случай с nvarchars с непостоянным размером.

CREATE FUNCTION [dbo].[udf_FullTextSearch](@searchExpression nvarchar(100))
RETURNS TABLE
AS
   RETURN
   SELECT *
   FROM Company c
   WHERE contains(c.Name, @searchExpression)
GO

DECLARE @searchExpression nvarchar(200) = '"ltd"'
SELECT * FROM [dbo].[udf_FullTextSearch](@searchExpression)