10

Używam wyszukiwania pełnotekstowego z LINQ w mojej aplikacji i ponieważ nie jest to obsługiwane przez LINQ Używam obejścia funkcja wartości tabela. Ta funkcja jest tworzona na serwerze SQL Server 2008.Parametr zapytania pełnotekstowego dla ciąg kwerendy pełnotekstowej jest nieprawidłowy

Co zaskakujące, pojawia się błąd "Parametr zapytania pełnego tekstu dla ciąg kwerend o pełnym tekście jest nieprawidłowy", gdy szukam prostego tekstu, np. "Manager"

Użyłem programu SQL Server Profiler i dowiedziałem się, że LINQ wygenerował parametr jako nvarchar (4000) zamiast nvarchar (250), który jest w mojej funkcji.

Największa niespodzianka pojawiła się, gdy zmieniłem moją funkcję SQL Server, więc akceptuje parametr jako nvarchar (4000) zamiast nvarchar (250) i problem został rozwiązany.

Grałem również, aby zmienić parametr na nvarchar (2000) i mniej, ale to też nie zadziałało.

Czy ktoś wie, dlaczego tak się zachowuje?

Zaktualizowano 18 listopada 2013 - Dobre i złe wieści

Dobra wiadomość - jestem teraz przy użyciu Entity Framework 6 dla tego konkretnego przykładu i nie jest już potrzebne do korzystania nvarchar (4000)

Bad news - Musisz użyć zamiast nvarchar (max) :-(

+0

Jedyną rzeczą, która przychodzi do głowy, to że masz pamięci podręcznej strukturę tabeli bazy danych podczas projektowania dbml. Możesz go całkowicie zmienić na nvarchar (max) i zmienić go w swoją aplikację. –

Odpowiedz

5
+0

Istnieje zgłoszenie błędu dla tego na [https://connect.microsoft.com/SQLServer/feedback/details/585759/lint-to-sql-parameter-resized](https://connect.microsoft.com/SQLServer/ feedback/details/585759/lint-sql-parameter-resized) –

+0

Jeśli ktoś to znajdzie (tak jak ja właśnie to zrobiłem), "prostym" rozwiązaniem jest ustawienie parametru funkcji "VarChar (8000)" i to działa. Wygląda na to, że błąd nadal działa. Nawet LinqPad powiedział, że moim parametrem z L2S był VarChar (1000), ale wciąż dostaję błędy. –

+0

Wygląda na to, że jest on związany z używaną wersją .NET. Uaktualniłem projekt do .NET 4 i otrzymałem ten problem. Zredukowaliśmy go z powrotem do .NET 3.5, a problem zniknął, mimo że używam VS 2012. – GSerg

-1

Musisz upewnić się, że rozmiar zmiennych varchar (lub nvarchar) jest taki sam w funkcji sql i gdzie są one zadeklarowane.

W moim przypadku miałem funkcję, która zadeklarowała zmienną jako nvarchar (100), ale procedura składowana, która wywołała funkcję, zadeklarowała, że ​​zmienna została przekazana jako nvarchar (200). Zmiana tej funkcji, która ma być taka sama jak zmienna procedury składowanej, naprawiła to.

Poniższy kod przedstawia niedziałający przypadek z niespójnymi rozmiarami nvarchar.

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) 
+0

Problem dotyczy Linq2Sql. Nie możesz tego rozwiązać w ten sposób. – GSerg

1

W moim przypadku musiałem zmusić Java, aby zadzwonić do mojego stolika-Value-Function z pasującymi typ danych jak poniżej

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