【问题标题】:How to pass userdefined table type to MSSQL request from Java如何将用户定义的表类型传递给来自 Java 的 MSSQL 请求
【发布时间】:2012-03-11 15:28:48
【问题描述】:

给定一个简单的存储过程,它有一个表,其中包含一列整数作为参数:

CREATE PROCEDURE [dbo].[table_sel]
@tbl INT32Table READONLY
AS
BEGIN
SET NOCOUNT ON;
SELECT value FROM @tbl
END

如何从 Java 执行这个存储过程?从 C# 这可以满足我的要求:

SqlConnection sqlconn;
System.Data.DataTable tbl = new System.Data.DataTable("INT32Table", "dbo");
tbl.Columns.Add("value", typeof(int));
tbl.Rows.Add(2);
tbl.Rows.Add(3);
tbl.Rows.Add(5);
tbl.Rows.Add(7);
tbl.Rows.Add(11);
using (SqlCommand command = new SqlCommand("table_sel"))
{
    command.Connection = sqlconn;
    command.Parameters.AddWithValue("@tbl", tbl);
    command.CommandType = System.Data.CommandType.StoredProcedure;
    SqlDataReader reader = command.ExecuteReader();

    //do stuff
}

【问题讨论】:

    标签: java sql sql-server-2008 stored-procedures


    【解决方案1】:

    在 Java 中,您应该使用 CallableStatement。 例如。

    java.sql.connection connection = //driver, url, database, credentials ...
    
    try
    {
        CallableStatement cs =
            connection.prepareCall("{ call table_sel(?) }");
        cs.setInt(1, your int);
        cs.execute();
    }
    catch (SQLException e)
    {
        // err handling goes here
    }
    finally
    {
        // close your ressources
    }
    

    问候 S

    【讨论】:

    • 我的问题不是调用存储过程,而是调用以表为参数的存储过程。练习的重点是将整数数组传递给存储过程。在您的示例中,您只传递了一个。基本上:为了传递表格,我应该写什么而不是“ca.setInt(1, int)”?
    【解决方案2】:

    哦,对不起, 据我所知,Java 中没有这样的表对象,您可以使用 cs.setObject() 但您应该再次从某个地方获取该对象(在 mssql 服务器上查询?)。 如果您正在寻找 JDBC 插入的性能,那么您应该考虑preparedStatements 和批处理执行。

    java.sql.connection connection = //driver, url, database, credentials ...
    
    try
    {
        PreparedStatement ps =
            connection.prepareStatement("insert into tbl values (?)");
        ps.setInt(1, your 1st int);
        ps.addBatch();
        ps.setInt(1, your 2nd int);
        ps.addBatch();
        ps.setInt(1, your 3rd int);
        ps.addBatch();
        ps.executeBatch();
    }
    catch (SQLException e)
    {
        // err handling goes here
    }
    finally
    {
        // close your resources
    }
    

    问候 S

    【讨论】:

    • 我正在寻找批量查询。那就是我希望做一个大查询并得到很多结果。
    • +1。这可能会帮助我做我想做的事,但由于它没有回答问题,我不会接受它。
    【解决方案3】:

    您不能使用 JDBC 传递 TVP。正如他们在 2 年前提到的那样,Microsoft JDBC 团队仍在努力解决这个问题。参考链接:

    访问:http://blogs.msdn.com/b/jdbcteam/archive/2012/04/03/how-would-you-use-table-valued-parameters-tvp.aspx

    通过传递 XML 参数并在过程主体中使用 OPENXML() 尝试一些替代解决方案,而不是使用 TVP。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      相关资源
      最近更新 更多