【问题标题】:The full-text query parameter for Fulltext Query String is not valid全文查询字符串的全文查询参数无效
【发布时间】:2011-04-15 20:07:28
【问题描述】:

我在我的应用程序中使用带有 LINQ 的全文搜索,由于 LINQ 不支持,我使用表值函数解决方法。该函数是在 SQL Server 2008 上创建的。

令人惊讶的是,当我搜索简单的文本时,我收到错误“全文查询字符串的全文查询参数无效”,例如“经理”

我使用 SQL Server Profiler 发现 LINQ 将参数生成为 nvarchar(4000) 而不是我函数中的 nvarchar(250)。

最大的惊喜是我更改了我的 SQL Server 函数,使其接受参数为 nvarchar(4000) 而不是 nvarchar(250),问题就解决了。

我也在玩将参数更改为 nvarchar(2000) 和更少,但这也没有用。

有人知道为什么会这样吗?

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

好消息 - 我现在在这个特定示例中使用 Entity Framework 6,并且不再需要使用 nvarchar(4000)

坏消息 - 你必须改用 nvarchar(max) :-(

【问题讨论】:

  • 唯一想到的就是你在设计dbml时缓存了数据库表结构。您可以将其完全更改为 nvarchar(max) 并在您的应用程序中重新映射。

标签: asp.net linq-to-sql sql-server-2008 user-defined-functions


【解决方案1】:

【讨论】:

  • 如果有人发现了这个(就像我刚刚做的那样),“简单”的解决方案是让你的函数参数为“VarChar(8000)”并且它可以工作。看起来这个错误仍然存​​在。甚至 LinqPad 都说我的 L2S 参数是 VarChar(1000),但我仍然遇到错误。
  • 这似乎与您使用的 .NET 版本有关。我将项目升级到 .NET 4 并遇到了这个问题。我将其降级回 .NET 3.5 并且问题消失了,即使我继续使用 VS 2012。
【解决方案2】:

在我的情况下,我不得不强制 JAVA 调用具有匹配数据类型的表值函数,如下所示

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

【讨论】:

    【解决方案3】:

    您需要确保 varchar(或 nvarchar)变量的大小在您的 sql 函数中以及它们的声明位置相同。

    在我的例子中,我有一个函数将变量声明为 nvarchar(100),但调用该函数的存储过程将传入的变量声明为 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)
    

    【讨论】:

    • 问题是 Linq2Sql 特有的。你不能这样解决。
    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2019-07-22
    相关资源
    最近更新 更多