2013-10-03 3 views
3

У меня есть хранимый процесс, который создает временную таблицу (#test), заполняет ее данными из другой таблицы, запускает 3 выборки в этой временной таблице и опускает ее.SQLSRV и несколько выборок в хранимой процедуре

Оригинальная таблица размером более 20 ГБ и 3 оператора SELECT содержат множество различных условий для исходного SP.

Я выполняю SP из PHP с использованием SQLSRV, однако мне удается получить только два первых набора результатов.

Если я запустил SP из MSSMS, он будет работать нормально и вернет 3 набора результатов, как ожидалось. Но из PHP он просто вернет 2 (пробовал каждую комбинацию).

Не уверен, что это проблема с драйвером, sqlsrv_fetch_array или sqlsrv_next_result.

Пример SP (выбранные заявления являются слишком большими, так что я буду просто возобновить их):

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 

Я делаю что-то неправильно здесь? Или есть способ получить 3 набора результатов из одного SP.

Заранее спасибо.

ответ

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); 

сделай в то время как цикл будет продвигаться через все результаты (вместо того, чтобы сделать это вручную). Кажется, что цикл через sqlsrv_fetch_array() необходим, поэтому я считаю, что это реальный ответ.

+0

Thanks! Решила мою проблему. боролся часами – 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; 
    } 
Смежные вопросы