怎么逃避? jdbc存储过程调用中的字符

时间:2009-12-16 16:13:03

标签: sql-server-2008 stored-procedures jdbc escaping

我想用jdbc:

调用这个存储过程
sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

JDBC认为?是一个参数的占位符。事实上,SP使用它来放入表名。我该如何调用存储过程?我试过这个:

CallableStatement call = jdbcConnection.prepareCall("call sp_msforeachtable(?)");
call.setString(1, "\"ALTER TABLE ? NOCHECK CONSTRAINT all\"");
call.executeUpdate();

我在'@ P0'附近遇到语法错误。我猜'@ P0'是?我怎么称呼这个SP?我正在使用SQL Server 2008 BTW。

1 个答案:

答案 0 :(得分:1)

你说?应该是一个表名,所以你需要在调用Statement.executeUpdate()之前提供一个实际的表名。此时,JDBC驱动程序将告诉数据库实际运行该语句,因此显然需要绑定所有参数。

也许你打算写这个:

CallableStatement call = jdbcConnection.prepareCall("call sp_msforeachtable(?)");
call.setString(1, "AnActualTableName");
call.executeUpdate();

或者你打算写这个:

CallableStatement call = jdbcConnection.prepareCall("call sp_msforeachtable(\"ALTER TABLE ? NOCHECK CONSTRAINT all\")");
call.setString(1, "AnActualTableName");
call.executeUpdate();

我不确定sp_msforeachtable()应该做什么,但我知道你必须在调用executeUpdate()之前提供所有参数的值