0

在安装之前,我们的应用程序会检查 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; 

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

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

奇怪的部分是当我使用 SQLMgmt 工作室时,一切都很好而且花花公子。创建插入等一切正常。当我使用我的java程序时它没有。

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

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

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

4

1 回答 1

0

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;
于 2016-03-11T22:40:03.603 回答