2013-10-03 32 views
3

我有一個存儲過程,它創建一個臨時表(#test),用另一個表中的數據填充它,在此臨時表上運行3個選擇並刪除它。存儲過程中的SQLSRV和多個選擇

原始表超過20 GB大,3個SELECT語句在原始SP上包含很多不同的條件。

我使用SQLSRV從PHP執行SP,但是我只能設法檢索2個第一個結果集。

如果我從MSSMS運行SP,它將運行得很好,並按預期返回3個結果集。但是從PHP它只會返回2(嘗試每個組合)。

不知道這是否是驅動程序sqlsrv_fetch_array或sqlsrv_next_result的問題。 SP的

的例子(select語句太大所以我就恢復它們):

CREATE PROCEDURE sp_transfers 
@dt date, 
@campaign varchar(16) 
AS 
BEGIN 
CREATE TABLE #test ([column definitions...]) 

BEGIN 
INSERT INTO #test SELECT * FROM sometable WHERE dt = @dt AND campaign = @campaign 

SELECT * FROM #test ... 
SELECT * FROM #test ... 
SELECT * FROM #test ... 

DROP TABLE #test 
END 

現在從PHP這是我的測試代碼:

$q = sqlsrv_query($conn,"EXEC sp_transfers @dt='2013-10-01',@campaign='1234'"); 

sqlsrv_next_result($q); 
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 1st resultset 
sqlsrv_next_result($q); 
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 2nd resultset 
sqlsrv_next_result($q); 
var_dump(sqlsrv_fetch_array($q)); // EMPTY 

然而儘管如此,如果我試試這個它的工作原理:

sqlsrv_next_result($q); 
sqlsrv_next_result($q); 
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 2nd resultset 
sqlsrv_next_result($q); 
var_dump(sqlsrv_fetch_array($q)); // OK - 3rd resultset shows up 

這個組合同樣的事情:

sqlsrv_next_result($q); 
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 1st resultset 
sqlsrv_next_result($q); 
sqlsrv_next_result($q); 
var_dump(sqlsrv_fetch_array($q)); // OK - 3rd resultset shows up 

我在這裏做錯了什麼?或者有沒有辦法從單個SP中獲取3個結果集。

在此先感謝。

回答

8

我其實只是有一個類似的問題,並設法得到以下工作:

$result = array(); 

// Get return value 
do { 
    while ($row = sqlsrv_fetch_array($query)) { 
     // Loop through each result set and add to result array 
     $result[] = $row; 
    } 
} while (sqlsrv_next_result($query)); 

print_r($result); 

的do-while循環將通過所有的結果前進(而不是手動執行此操作)。 似乎循環sqlsrv_fetch_array()是必不可少的,所以我認爲這是真正的答案。

+0

謝謝!解決了我的問題。掙扎了好幾個小時 – KiKMak

0
// this example for storing the data in drop down menu - php 

    // need to connect data base first 
    $connectionInfo = array("Database"=>$database, "UID"=>DATABASE_USER, "PWD"=>DATABASE_PASSWORD); 
    $conn = sqlsrv_connect($serverName, $connectionInfo); 

    /// $SQLquery = NOTE write sql query here 

    $stmt = sqlsrv_query($conn, $SQLquery); 
     if($stmt === false) { 
      die(print_r(sqlsrv_errors(), true)); 
     } else { 
      Display("SQLquery executed"); 
     } 
     $result = array(); 
      $fetchLimit = 0; // control the infinite loop 
     while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 

       //echo $row['COLUMN_NAME']. "<br>"; 
       // Loop through each result set and add to result array 
       $result[] = $row['COLUMN_NAME'];   

      // results store here = you need to change 'COLUMN_NAME' based on yoru sql query received data name 

       $fetchLimit++; 
       if($fetchLimit>60000) 
       break; 
     } 
     echo dropdown("test", $result, 1000); 



    add this function for storing in drop down 

    function dropdown($name, array $options, $selected=null) 
    { 
     /*** begin the select ***/ 
     $dropdown = '<select name="'.$name.'" id="'.$name.'">'."\n"; 

     $selected = $selected; 
     /*** loop over the options ***/ 
     foreach($options as $key=>$option) 
     { 
      /*** assign a selected value ***/ 
      $select = $selected==$key ? ' selected' : null; 

      /*** add each option to the dropdown ***/ 
      $dropdown .= '<option value="'.$key.'"'.$select.'>'.$option.'</option>'."\n"; 
     } 

     /*** close the select ***/ 
     $dropdown .= '</select>'."\n"; 

     /*** and return the completed dropdown ***/ 
     return $dropdown; 
    }