【问题标题】:How to Call SQL NOCOUNT outside from a Java application如何从 Java 应用程序外部调用 SQL NOCOUNT
【发布时间】:2016-03-11 20:51:31
【问题描述】:

在安装之前,我们的应用程序会检查 SQL 以确保它具有正确的权限以及各种设置。其中一个设置是@@OPTION NOCOUNT

我似乎一生都无法弄清楚如何从数据库中提取这个值。

我已经试过了。不管NOCOUNT是开还是关,总是返回1。

  DECLARE @NOCOUNT INT = 1; IF ( (512 & @@OPTIONS) = 512 ) SET   @NOCOUNT = 10;          
   SELECT @NOCOUNT AS NOCOUNT;

我尝试在 Java 中使用单独的 SQL 语句创建一个临时表,并尝试从那里提取值,但没有成功。表创建得很好,但在这种情况下始终插入的值为零。

CREATE TABLE TempNoCount(tNoCount int);
DECLARE @NOCOUNT int = 0; 
IF ( (512 & @@OPTIONS) = 512 ) SET @NOCOUNT = 1;
INSERT INTO #TempNoCount (tNoCount) VALUES (@NOCOUNT);

不管我做什么,我似乎无法从数据库中提取正确的值。

即使在 Java 中运行此查询也返回零。

 DECLARE @NOCOUNT INT = 0
 IF @@OPTIONS & 512 > 0 SET @NOCOUNT = 2
 SELECT @NOCOUNT AS NC

我也刚刚尝试过通过 java 进行简单查询:

 SELECT CONVERT(INT,@@OPTIONS & 512) as NOCOUNT; 

不管它是打开还是关闭,仍然总是返回零。

我花了几天时间试图弄清楚如何使用 java 应用程序检查 NOCOUNT 是打开还是关闭,但我已经没有想法了。

奇怪的是,当我使用 SQLMgmt 工作室时,一切正常且花花公子。创建插入等一切正常。当我使用我的 java 程序时它不会。

这是java的i限制吗? MS不想让你使用外部程序拉@@OPTIONS吗?

我什至尝试了存储过程。当我调用存储过程时,它仍然返回零,即使在打开NOCOUNT 时结果应该是 512....

有什么建议吗?在这一点上,我更乐意尝试任何事情。

【问题讨论】:

  • 您能否分享更多关于使用哪个库连接到 SQL Server 的信息?
  • 另外,在您的第一个 TSQL 示例中,您是如何设置 NOCOUNT 开/关的?你有没有尝试明确地把它放在那里?即在顶部添加SET NOCOUNT ON
  • 我也打开了 SQLMgmt 工作室。我从那里打开和关闭它。
  • 我只是在使用 java.sql libarays。导入 java.sql.CallableStatement;导入java.sql.Connection;导入 java.sql.DriverManager;导入 java.sql.PreparedStatement;导入java.sql.ResultSet;导入java.sql.SQLException;导入 java.sql.Statement;
  • 这是一个客户端设置,您正在为该特定连接打开/关闭它。如果您想为给定的连接打开/关闭它,然后明确设置它,然后进行检查。

标签: java sql-server tsql nocount


【解决方案1】:

Java.sql.* 驱动程序使用 JDBC,而 SSMS 使用 ODBC 连接到 sql server 我相信(取决于您拥有的 SQL 版本)。我猜测这些 SET 语句是专有的,因此 ODBC/SQLOLEDB 和 JDBC 之间的默认值会有所不同。所以,我猜想 SET NOCOUNT 会默认为 ODBC/SQLOLEDB 关闭,而 JDBC 则默认开启。

您可以轻松验证这一点,只需切换 SET NOCOUNT 值,然后运行:

SET NOCOUNT OFF
DECLARE @NOCOUNT INT = 1;
IF ( (512 & @@OPTIONS) = 512 ) SET @NOCOUNT = 10;          
SELECT @NOCOUNT AS NOCOUNT;

【讨论】:

  • SSMS 使用 .Net Provider for SQL Server(又名 SqlClient)进行数据访问。当前版本的 SQLCMD 使用 ODBC。
  • 嗯,很有趣...我不认为简单地检查 NoCount 是打开还是关闭会这么难。让我试试这些建议。
  • 这一定和Mgmt studio和命令有关。所以我尝试了一个测试。创建表,创建一个将 NoCount 的值插入到表中的存储过程。 java程序执行存储的过程,然后我做了一个选择。当 java 程序执行存储过程时,它总是插入一个零值,如果我从 SQLMgmt 工作室执行存储过程,它会添加正确的值...
猜你喜欢
  • 2011-11-10
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2022-07-12
相关资源
最近更新 更多