0

奇怪的行为。

我们有 MSSQL 服务器 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);              
}
4

1 回答 1

2

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

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

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

但当然应该是这样的:

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

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

...containstable(myTable, myColumn, ?, language ?, ?)

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

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

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

于 2013-05-24T16:08:27.957 回答