【问题标题】:How to escape ? character in jdbc stored procedure calls如何逃跑? jdbc 存储过程调用中的字符
【发布时间】:2009-12-16 16:13:03
【问题描述】:

我想用 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 顺便说一句。

【问题讨论】:

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


    【解决方案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() 之前为所有参数提供值

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 2015-05-28
      • 1970-01-01
      • 2014-11-24
      • 2016-05-03
      • 2014-06-30
      • 2015-04-20
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多