java - Java 中全文 MSSQL 表上的PreparedStatement 仅需要 3 个参数

标签 java sql-server-2008 jdbc

奇怪的行为。

我们有 MSSQL Server 2008 R2。

我们的 Java Servlet 正在使用以下连接调用一个PreparedStatement。

... inner join Containstable (fulltextTable, mycolumn, ?) as KeyTable on id = KeyTable.[KEY] ...

哪里? = 针

这很好用。

但是当我像这样向 Containstable 添加两个参数时:

... inner join Containstable (fulltextTable, mycolumn, ?, ?, ?) as KeyTable on id = KeyTable.[KEY] ...

哪里? = 针(搜索),? = LANGUAGE N'德语'(语言),? = 250(将结果限制为 250 行)

我得到这个异常:

java.sql.SQLException: Argument data type nvarchar is invalid for argument 4 of CONTAINSTABLE function.

这在 SQL Server Management Studio 中运行良好。

这是 Java 中的 SQLServerDriver 的问题吗?

干杯 每

这是我的代码 - 这有效:

if (contains!=null && contains.length()!=0) {
    sql.append(" inner join Containstable( myFulltext, myColumn, ?) as KeyTable on id = KeyTable.[KEY]");

    elementTypes.add(Types.NVARCHAR);
    paramObject.add(contains);
    //elementTypes.add(Types.NVARCHAR);
    //paramObject.add("LANGUAGE N'German'");
    //elementTypes.add(Types.BIGINT);
    //paramObject.add(maxResults);              
}

最佳答案

我怀疑这是因为 CONTAINSTABLE 的第三个“参数”不是普通的标量参数,它是一个关键字 (LANGUAGE) 后跟一个值。

很可能 JDBC 正在将 LANGUAGE N'German' 转换为 'LANGUAGE N''German''' 并且生成的 SQL 是这样的,这在 SSMS 中也是无效的:

...containstable(myTable, myColumn, 'needle', '语言 N''德语''', 250)

但当然应该是这样的:

...containstable(myTable, myColumn, 'needle', language N'German', 250)

您可以通过使用 SQL Profiler 跟踪实际发送到服务器的 SQL 来确认这一猜测。至于解决方案,我不知道 JDBC 是否会接受这个:

...containstable(myTable, myColumn, ?, 语言 ?, ?)

如果没有,您可能必须使用动态 SQL 来构建完整的 SQL 字符串来执行,如下所示(我的引用可能不完全正确,但您应该明白这一点):

set @sql = N'...containstable(myTable, myColumn, ''' + @search term + ''', 语言 ''' + @language + ''', + cast(@rows作为 nvarchar(10)) + ')'

不幸的是,TSQL 语法对于允许和不允许参数的位置非常不一致,这似乎就是这样一种情况。

关于java - Java 中全文 MSSQL 表上的PreparedStatement 仅需要 3 个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16738381/

相关文章:

java - Netbeans 和 Glassfish 部署问题

sql - MS SQL 中两列之一的 SELECT MAX(column) AND DISTINCT

java - 在 infinispan 中使用 (mysql) jdbc 存储时,__defaultcache' 不存在错误

java - 使用 JDBC 获取 BLOB 数据时出错

java - 分片环境下如何管理DB连接池?

java - 没有谷歌凭据的 Firebase 云消息传递

java - 使用 postgresql 从表中获取最新记录

java - 递归和不变性

sql - 如何在 SQL Server 2008 中分析 'dbcc memorystatus' 结果

sql-server - 具有 DateTimeOffset 的执行计划行为