2014-02-13 60 views
2

我有一個相當大且複雜的SQL塊,它爲特定頁面創建報告。這個SQL在頂部有幾個變量聲明,我懷疑是給了我一些問題。ODBC,PHP和SQL變量

當我得到ODBC結果時,必須使用odbc_next_result()來越過似乎與變量一起返回的空結果集。這似乎沒有問題。當我最終得到「真實」結果時,odbc_num_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); 

的SQL看起來是這樣的:

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 
+0

對於一個實驗,嘗試更改proc並不實際返回任何內容(即註釋掉select語句)。 odbc_num_rows()是否仍然返回超過12k行? – Ruslan

+0

嘗試在SQL語句塊的頂部添加'set nocount on;'。 Sql返回每個命令返回給客戶端的行數,這會導致這些空的結果集。 – dav1dsm1th

+1

@ dav1dsm1th - 好的電話,我忽略了。它已經解決了這個問題。你可以把它作爲答案發布,以便我可以接受它嗎? –

回答

1

一般來說它總是一個好主意,開始每一個存儲過程或命令的批量執行,與set nocount on指令 - whi ch告訴SQL Server禁止通過ODBC(或ADO等)向客戶端應用程序發送「rows affected」消息。這些消息會影響性能並導致在結果集中創建空記錄集 - 這會給應用程序開發人員帶來額外的工作量。

我也使用了ODBC驅動程序,如果您忘記禁止這些消息,實際上會出錯 - 因此,只要我開始編寫任何新的存儲過程,就會立即輸入set nocount on

有關於這個問題的各種問題/答案,例如What are the advantages and disadvantages of turning NOCOUNT off in SQL Server queries?SET NOCOUNT ON usage其中涵蓋此命令的許多其他方面。