奇怪的行为。
我们有 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/