当前位置: 首页 > 知识库问答 >
问题:

如何使用JTDS将表值参数传递给存储过程?

邹京
2023-03-14
            Connection con = ds.getConnection();
            CallableStatement call = con.prepareCall("{call getErrosSKF ?,?,?,?}");
            call.setString("agrupador", agrupador);
            call.setDate(2, new Date(dataInicio.getTimeInMillis()));
            call.setDate(3, new Date(dataFim.getTimeInMillis()));   

            SQLServerDataTable areas = new SQLServerDataTable();
            areas.addColumnMetadata("id",Types.INTEGER);
            for(Integer a : skfIdAreas) {
                areas.addRow(a);
            }
             // generate an exception
            ((SQLServerCallableStatement) call).setStructured(4, "erroSKFTable", areas);

共有1个答案

姚文轩
2023-03-14

对表值参数(TVPs)的支持是微软的SQL Server JDBC驱动程序最近增加的一项内容,事实上,根据...

JDBC驱动程序的系统要求

...微软目前可用的JDBC驱动程序都不能与JRE6一起工作。您可以尝试从Microsoft找到一个古老的JDBC驱动程序,但它无论如何都不直接支持TVPs,所以您还不如坚持使用JTDS。

    null
letter  word
------  -------
A       Alfa
B       Bravo
C       Charlie
...
Y       Yankee
Z       Zulu

...用户定义的表类型...

CREATE TYPE [dbo].[LetterListTableType] AS TABLE(
    [seq] [int] NOT NULL,
    [letter] [varchar](1) NOT NULL,
    PRIMARY KEY CLUSTERED 
(
    [seq] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)

...和将该表类型作为参数的存储过程...

CREATE PROCEDURE [dbo].[GetPhonetic] 
    @letters dbo.LetterListTableType READONLY
AS
BEGIN
    SET NOCOUNT ON;
    SELECT l.seq, l.letter, p.word 
        FROM phonetic p INNER JOIN @letters l on p.letter = l.letter
        ORDER BY l.seq;
END

...下面的Java代码...

// 0. create some test data
String[] letters = new String[] { "G", "o", "r", "d" };
//
// 1. create temporary table
Statement s = conn.createStatement();
s.executeUpdate("CREATE TABLE #tmp (seq INT IDENTITY PRIMARY KEY, letter VARCHAR(1))");
//
// 2. populate temporary table with letters to look up
PreparedStatement ps = conn.prepareStatement("INSERT INTO #tmp (letter) VALUES (?)");
for (String letter : letters) {
    ps.setString(1, letter);
    ps.addBatch();
}
ps.executeBatch();
//
// 3. use anonymous code block to pass table-valued parameter to stored procedure
String sql = 
          "SET NOCOUNT ON; "
        + "DECLARE @tvp dbo.LetterListTableType; "
        + "INSERT INTO @tvp (seq, letter) SELECT seq, letter FROM #tmp; "
        + "EXEC dbo.GetPhonetic @tvp; ";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
    System.out.printf("%s -> %s%n", rs.getString("letter"), rs.getString("word"));
}
G -> Golf
o -> Oscar
r -> Romeo
d -> Delta
 类似资料:
  • 问题内容: 我有一个具有以下属性的类: 现在,我有一个包含这样的对象的对象, 我需要将此数组列表传递给sql服务器存储过程,并将学生对象数据插入表中。如何在Java中最好地实现这一目标?我需要有一个存储过程。 Java版本8,Sql Server 2014(如果有任何用途)。 问题答案: 使用Mark Rotteveel提供的输入,我能够做到。谢谢马克,肖恩也感谢您的输入。这是可能对您有用的任何人

  • 问题内容: 我有大约六种通用但相当复杂的存储过程和函数,我想以一种更通用的方式使用它们。 理想情况下,我希望能够将表名作为参数传递给过程,因为当前它是硬编码的。 我所做的研究表明,我需要将过程中所有现有的SQL转换为使用动态SQL,以便从参数中拼接动态表名称,但是我想知道是否还有一种更简便的方法可以通过另一种方式引用该表? 例如: 如果是这样,如何从表名设置@MyTable变量? 我正在使用SQL

  • 问题内容: 我正在使用一个存储过程,在其中发送数据库中其类型为的存储过程,并且还声明parameter 。 当我将列名传递为float时,它给出了错误: 消息8114,将数据类型nvarchar转换为float时出错。 这是我的测试查询 当我将参数类型更改为时,它给了我这个错误: 消息8117,操作数数据类型varchar对avg运算符无效。 我该如何解决? 更新 : 这是我的存储过程: 问题答案

  • 如何设置参数< code>@p_ItemShelfList [file]。[udtt _ ItemShelfPair]READONLY 与 当我尝试时,我得到一个 操作数类型冲突:nvarchar与udtt_ItemShelfPair不兼容 连接类

  • com.microsoft.sqlserver.jdbc.sqlserverexception:操作数类型冲突:nvarchar与com.microsoft.sqlserver.jdbc.sqlserverexception.makefromdatabaseerror(sqlserverexception.java:196)com.microsoft.sqlserver.jdbc.sqlserve

  • 问题内容: 我已经搜索了一段时间,似乎找不到任何真正的答案。 我有一个Oracle存储过程,该存储过程具有许多in参数,这些参数的类型是表rowtype的表。因此,例如: 在pacakge中声明: Oracle过程: 在Java方面,我有3个对应的对象列表,它们表示用Java填充的每个参数。在这种情况下可以使用MyBatis调用Oracle过程吗? 对象本身是具有String和Integer属性以