SQLSRV et multiple sélectionne dans la procédure stockée

J'ai un process stocké qui crée une table temporaire (#test), la remplit avec des données d'une autre table, exécute 3 sélections sur cette table temporelle et la supprime.

La table d'origine a une taille de plus de 20 Go et les 3 instructions SELECT contiennent beaucoup de conditions différentes sur le SP original.

J'exécute le SP à partir de PHP en utilisant SQLSRV mais je ne parviens à récupérer que les 2 premiers jeux de résultats.

Si je lance le SP à partir de MSSMS, il fonctionnera très bien et renvoie les 3 résultats comme prévu. Mais à partir de PHP il va juste revenir 2 (essayé toutes les combinaisons).

Vous ne savez pas si c'est un problème avec le pilote, sqlsrv_fetch_array ou sqlsrv_next_result.

Exemple de SP (les instructions select sont trop grandes donc je vais les reprendre):

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 

Maintenant, depuis PHP c'est mon code de test:

 $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 

Cependant, si j'essaye cela, cela fonctionne:

 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 

Même chose avec cette combinaison:

 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 

Est-ce que je fais quelque chose de mal ici? Ou y at-il un moyen d'aller chercher les 3 résultats à partir d'un seul SP.

Merci d'avance.

En fait, j'avais juste un problème similaire et j'ai réussi à faire fonctionner ce qui suit:

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

La boucle do-while avancera à travers tous les résultats (plutôt que d'avoir à le faire manuellement). Il semble que boucler à travers sqlsrv_fetch_array () est essentiel donc je pense que c'est la vraie réponse.

 // 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; }