10

我在我的應用程序中使用帶有LINQ的全文搜索,因爲LINQ不支持此功能我使用表值函數解決方法。在SQL Server上創建函數2008全文查詢字符串的全文查詢參數無效

出人意料的是,我得到錯誤「的全文查詢字符串中的全文查詢參數無效」當我搜索一個簡單的文本例如「經理人」

我使用SQL Server事件探查,結果發現,LINQ生成的參數爲爲nvarchar(4000),而不是爲nvarchar(250),這是在我的功能。

最大的驚喜來到時,我改變了我的SQL Server功能,因此它接受的參數爲爲nvarchar(4000),而不是爲nvarchar(250),問題就解決了。

我也玩到改變參數爲nvarchar(2000年)和少但是這也沒有工作。

有人知道爲什麼這樣表現嗎?

更新於2013年11月18日 - 好消息和壞消息

好消息 - 我現在使用的實體框架6這個特殊的例子,它不再需要使用爲nvarchar(4000)

壞消息 - 你必須使用,而不是爲nvarchar(最大) :-(

+0

,想到的唯一的事情是,你有數據庫表結構緩存在設計dbml時。您可以將它完全更改爲nvarchar(max),並將其重新映射到您的應用程序中。 – 2010-09-22 16:19:00

回答

5
+0

這裏有一個錯誤報告[https://connect.microsoft.com/SQLServer/feedback/details/585759/lint-to-sql-parameter-resized](https://connect.microsoft.com/SQLServer/ feedback/details/585759/lint-to-sql-parameter-resized) – 2012-06-04 13:59:31

+0

如果有人發現這種情況(就像我剛纔那樣),「簡單」的解決方案是讓你的函數參數「VarChar(8000)」,它的工作原理。看起來bug仍然存在。即使LinqPad說我L2S的參數是VarChar(1000),但我仍然有錯誤。 – 2016-01-13 16:30:23

+0

這似乎與您正在使用的.NET版本有關。我將該項目升級到.NET 4並解決了這個問題。我將它降級到.NET 3.5並且問題沒有了,儘管我繼續使用VS 2012. – GSerg 2016-05-11 10:49:54

-1

您需要確保將varchar(或nvarchar)變量在你的SQL函數相同的,在那裏他們被宣佈的大小。

在我來說,我有這樣的聲明(100)中的變量爲nvarchar但調用的函數聲明中傳遞過來的數據類型爲nvarchar(200)變量的存儲過程的功能。將函數更改爲與存儲過程變量相同可以解決此問題。

下面的代碼顯示了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

這個問題特定於Linq2Sql。你不能這樣解決它。 – GSerg 2016-05-11 10:48:26

1

在我來說,我不得不強迫JAVA調用我的表,價值功能相匹配的數據類型,如下

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