ODBC、PHP和SQL变量

ODBC、PHP和SQL变量,php,sql,tsql,odbc,Php,Sql,Tsql,Odbc,我有一个相当大、复杂的SQL块,用于为特定页面创建报告。这个SQL在顶部有几个变量声明,我怀疑这会给我带来问题 当我得到ODBC结果时,我必须使用ODBC\u next\u result()来通过似乎随变量返回的空结果集。这似乎没问题。当我最终得到“真实”结果时,odbc\u num\u rows()告诉我它有12000多行,而实际上它有6行 下面是我正在做的一个示例,让您了解我的想法,而不必详细讨论类定义: $report = $db->execute(Reports::create_s

我有一个相当大、复杂的SQL块,用于为特定页面创建报告。这个SQL在顶部有几个变量声明,我怀疑这会给我带来问题

当我得到ODBC结果时,我必须使用
ODBC\u next\u result()
来通过似乎随变量返回的空结果集。这似乎没问题。当我最终得到“真实”结果时,
odbc\u num\u rows()
告诉我它有12000多行,而实际上它有6行

下面是我正在做的一个示例,让您了解我的想法,而不必详细讨论类定义:

$report = $db->execute(Reports::create_sql('sales-report-full'));
while(odbc_num_rows($report) <= 1) {
    odbc_next_result($report);
}
echo odbc_num_rows($report);

一般来说,最好使用
set nocount on
指令启动每个存储过程或要执行的一批命令,该指令告诉SQL Server禁止通过ODBC(或ADO等)向客户端应用程序发送“受影响的行”消息。这些消息会影响性能并导致在结果集中创建空记录集,这会给应用程序开发人员带来额外的工作量

我还使用了ODBC驱动程序,如果您忘记抑制这些消息,它实际上会出错——因此,在我开始编写任何新的存储过程时,我会本能地键入
set nocount on


例如,与此主题相关的各种问题/答案涵盖了此命令的许多其他方面。

对于一个实验,请尝试更改proc以不实际返回任何内容(即注释掉select语句)。odbc_num_rows()是否仍返回超过12k行?请尝试添加
设置nocount on位于SQL语句块的顶部。Sql将每个命令影响的行数的计数返回给客户机-这会导致这些空结果集。@dav1dsm1th-很好的调用,我忽略了这一点。它解决了这个问题。你能把它作为答案贴出来让我接受吗?
DECLARE @actualYear int = YEAR(GETDATE());
DECLARE @curYear int = YEAR(GETDATE());
IF MONTH(GETDATE()) = 1
    SELECT @curYear = @curYear - 1;
DECLARE @lastYear int = @curYear-1;
DECLARE @actualLastYear int = @actualYear-1;
DECLARE @tomorrow datetime = DATEADD(dd, 1, GETDATE());
SELECT * FROM really_big_query