10

Sto utilizzando la ricerca di testo completo con LINQ nella mia applicazione e poiché questo non è supportato da LINQ, utilizzo una soluzione a valori di tabella. La funzione viene creata su SQL Server 2008.Il parametro di query full-text per FullText Query String non è valido

Sorprendentemente, viene visualizzato l'errore "Il parametro di query full-text per FullText Query String non è valido" quando cerco semplicemente un testo, ad es. "Manager"

Ho usato SQL Server Profiler e ho scoperto che LINQ ha generato il parametro come nvarchar (4000) invece di nvarchar (250), che è nella mia funzione.

La sorpresa più grande è arrivata quando ho cambiato la mia funzione SQL Server in modo che accetti i parametri come nvarchar (4000) invece di nvarchar (250) e il problema è risolto.

Stavo anche giocando per cambiare il parametro in nvarchar (2000) e meno, ma anche questo non ha funzionato.

Qualcuno sa perché questo si comporta in questo modo?

aggiornamento il 18 novembre 2013 - Buone notizie e cattive notizie

Buone notizie - ora sto usando Entity Framework 6 per questo particolare esempio e non è più bisogno di usare nvarchar (4000)

Cattive notizie - Devi usare invece nvarchar (max) :-(

+0

L'unica cosa che viene in mente è che si ha la cache struttura delle tabelle del database quando si progetta dbml. Puoi cambiarlo completamente in nvarchar (max) e rimapparlo nella tua applicazione. –

risposta

5
+0

C'è una segnalazione di bug per questo in [https://connect.microsoft.com/SQLServer/feedback/details/585759/lint-to-sql-parameter-resized](https://connect.microsoft.com/SQLServer/ feedback/dettagli/585759/lint-to-sql-parameter-ridimensionato) –

+0

Nel caso qualcuno lo trovi (come ho appena fatto), la soluzione "semplice" è quella di rendere il parametro della funzione "VarChar (8000)" e funziona. Sembra che l'errore sia ancora presente. Anche LinqPad ha detto che il mio parametro da L2S era VarChar (1000), ma continuavo a ricevere errori. –

+0

Questo sembra essere correlato alla versione .NET che si sta utilizzando. Ho aggiornato il progetto a .NET 4 e ho riscontrato questo problema. Ho effettuato il downgrade di .NET 3.5 e il problema era scomparso, anche se continuo a utilizzare VS 2012. – GSerg

-1

È necessario assicurarsi che le dimensioni delle variabili varchar (o nvarchar) siano le stesse nella funzione sql e in cui sono dichiarate.

Nel mio caso ho avuto una funzione che ha dichiarato la variabile come nvarchar (100) ma la stored procedure che ha chiamato la funzione ha dichiarato la variabile passata come nvarchar (200). La modifica della funzione per essere uguale alla variabile di procedura memorizzata ha risolto questo problema.

Il codice seguente mostra il caso non funzionante con i nvarchar incoerentemente dimensionati.

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

Il problema è specifico per Linq2Sql. Non puoi risolverlo in questo modo. – GSerg

1

Nel mio caso ho dovuto forzare JAVA di chiamare la mia tabella valore di funzione con corrispondenti tipo di dati, come di seguito

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