MS SQL 和 Java:在调用存储过程期间找不到表变量

Posted

技术标签:

【中文标题】MS SQL 和 Java:在调用存储过程期间找不到表变量【英文标题】:MS SQL and Java: cannot find table variable during call stored procedure 【发布时间】:2016-11-09 08:18:32 【问题描述】:

我正在尝试从 Java 执行 MS-SQL 存储过程。

其中一个过程参数是一个表变量(在这种情况下,它被称为 [Items])。 在单独的模式中定义的过程和表变量(在本例中为 [test])。

在调用过程中,出现以下错误“com.microsoft.sqlserver.jdbc.SQLServerException: Column, parameter, or variable @P1. : Cannot find data type Items.”。

我使用 Spring 的 SimpleJdbcCall 和 Microsoft 的 jdbc 驱动程序 - sqljdbc-6.0 来处理 MS-SQL:

SimpleJdbcCall testCall = new SimpleJdbcCall(jdbcTemplate)
        .withSchemaName("[test]")
        .withProcedureName("[SomeTestProcedure]")
        .withoutProcedureColumnMetaDataAccess()
        .declareParameters(
                new SqlParameter("Id", Types.INTEGER),
                new SqlParameter("Items", microsoft.sql.Types.STRUCTURED));
testCall.compile();
SQLServerDataTable sdt;
try 
    sdt = new SQLServerDataTable();
    sdt.addColumnMetadata("Name", Types.NVARCHAR);
    sdt.addColumnMetadata("Value", Types.INTEGER);
    sdt.addRow("DEV", 1);
    sdt.addRow("PROD", 2);
 catch (SQLServerException e) 
    throw new IllegalStateException(e);

testCall.execute(1, sdt);

如果能帮助我解决问题,我将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

我发现,驱动程序尝试使用设置给用户的默认模式中的表变量。

在我的例子中,[dbo]-scheme 被设置为 default 模式。 因此,[dbo]-scheme 没有此表变量 [Items],导致错误“找不到数据类型项目”。 在我们将用户的默认模式更改为 [test](其中创建了表变量)后,错误消失了。

【讨论】:

以上是关于MS SQL 和 Java:在调用存储过程期间找不到表变量的主要内容,如果未能解决你的问题,请参考以下文章

从 MS SQL SERVER 和 MS ACCESS 调用存储过程的结果之间的差异

MS SQL Server 2005 - 存储过程“自发中断”

MS sql如何使用存储过程?

在存储过程调用期间,您何时可以看到更新、插入和删除的效果?

带参数的ms sql server的扩展存储过程,怎么传递参数

存储过程的 MS-SQL 权限