none
Retorno de dados para o PHP RRS feed

  • Pergunta

  • Boa Tarde 

    Pessoal estou desenvolvendo um webservice com php + sql server e em uma determinada função do meu programa php eu chamo uma stored procedure do sql server que retornar um arquivo xml para mim segue minha função e minha stored procedure abaixo:

    <?php
        $servidor = '127.0.0.1';
        $usuario = 'SA';
        $banco = 'TESTE';
        $senha = '123';
               
        $connectionInfo = array( "UID"=>$usuario, "PWD"=>$senha, "Database"=>$banco);
      
        $conexao = sqlsrv_connect($servidor, $connectionInfo);
    	
    	$IDPESSOA = 1474;
    	$DTDIGITACAO = '2015-01-21T00:00:00';
    	$DTINICIOATIVIDADE = '2015-01-21T00:00:00';
    	$DTFIMATIVIDADE = '2015-01-31T00:00:00';
    	$TITULO = 'TESTE DE INCLUSAO DA AGENDA';
    	$DESCRICAO = 'TESTANDO A INCLUSAO DA AGENDA';
    	$PRIORIDADE = 'A';
    	$resultado = '';
            $XMLINSEREAGENDA = '';
    	
    	$sql = "exec WEB_SINCRO_INSERE_AGENDA " .$IDPESSOA .", '" .$DTDIGITACAO ."', '" .$DTINICIOATIVIDADE ."' , '" .$DTFIMATIVIDADE ."' , '" .$TITULO ."' , '" .$DESCRICAO ."' , '" .$PRIORIDADE ."' , ''" ;
                     
            $param = array();
            $resposta = sqlsrv_query($conexao,  $sql, $param);        
        	   
            while( $row = sqlsrv_fetch_array( $resposta, SQLSRV_FETCH_BOTH) ) 
            {
              $XMLINSEREAGENDA =  $row['RETORNO'];               
            }
                        
           
            $arquivo = fopen('c:\spool\INSERIAGENDA.xml','w+');
            if ($arquivo) {
              if (!fwrite($arquivo, $XMLINSEREAGENDA)) die('Não foi possível atualizar o arquivo.');
                 echo 'Arquivo XML Gerado com Sucesso Inseri Agenda' . "<br />";
                 fclose($arquivo);
            }
    ?>

    Stored procedure

    ALTER PROCEDURE [dbo].[WEB_SINCRO_INSERE_AGENDA] (@IDPESSOA INTEGER, @DTDIGITACAO AS SMALLDATETIME, @DTINICIOATIVIDADE AS SMALLDATETIME, @DTFIMATIVIDADE AS SMALLDATETIME, @TITULO VARCHAR(50), 
                                               @DESCRICAO VARCHAR(MAX), @PRIORIDADE VARCHAR(1), @XML XML OUTPUT) 
    AS 
    BEGIN
       DECLARE @IDAGENDA AS INTEGER
    
       SET @IDAGENDA = NULL
       SET @XML = NULL
    
       BEGIN TRY
          IF EXISTS(SELECT PESSOA FROM PESSOA WHERE PESSOA = @IDPESSOA)
    	  BEGIN
              INSERT INTO AGENDA (MODULO, PESSOARESPONSAVEL, PESSOA, DT_DIGITADAAGENDA, DT_INICIOATIVIDADE, DT_FIMATIVIDADE, DS_LOCALIZACAO, IN_SITUACAO,
                                      IN_PRIORIDADE, ID_PESSOABENEFICIARIO, DS_ATIVIDADEDETALHADA, DS_ATIVIDADE, ID_PESSOACANCELAMENTO, DT_CANCELAMENTO, IN_CANCELAMENTOMOTIVO,
                                      IN_BLOQUEADO)
                               SELECT 0, @IDPESSOA, @IDPESSOA, @DTDIGITACAO, @DTINICIOATIVIDADE, @DTINICIOATIVIDADE, '', 'A', @PRIORIDADE, 0, @DESCRICAO, @TITULO, NULL, NULL, NULL,'N'
    
    	      SET @IDAGENDA = (SELECT MAX(ID_AGENDA) FROM AGENDA)
    
    	      SET @XML = (SELECT ID_AGENDA AS IDAGENDA, DT_DIGITADAAGENDA  AS DTDIGITACAO, DT_INICIOATIVIDADE AS DTINICIO, DT_FIMATIVIDADE AS DTFIM, 
    		                     DS_ATIVIDADE AS ATIVIDADE, DS_ATIVIDADEDETALHADA AS DETALHE, 'DADOS INSERIDOS COM SUCESSO' AS RETORNO
    		                FROM AGENDA 
    				       WHERE ID_AGENDA = @IDAGENDA
    				       FOR XML PATH ('AGENDA'))	      
          END
    	  ELSE
    	  BEGIN
    	      RAISERROR('PESSOA NAO LOCALIZADA', 16, 1)
    	  END
       END TRY
       BEGIN CATCH
             SET @XML = (SELECT '' AS IDAGENDA, '' AS DTDIGITACAO, '' AS DTINICIO, '' AS DTFIM, '' AS ATIVIDADE, '' AS DETALHE, ERROR_MESSAGE() AS RETORNO
    		                FOR XML PATH ('AGENDA'))
       END CATCH
    
      
       SELECT @XML AS RETORNO
    END
    O que acontece é o seguinte executando a stored procedure no sql server manualmente o processo é executado com sucesso e o mesmo gerar o xml de retorno sem maiores problemas, porém quando executo a mesma stored procedure contendo os mesmos parâmetros eu percebo que o insert é executado corretamente porem não vem retorno nem um não consegui ainda entender o motivo, afim de tentar resolver o problema fiz o seguinte criei uma stored procedure no sql server que tem por finalidade somente inserir dados e outra para gerar o xml de retorno só como experiência e assim funcionou sem maiores problemas mas gostaria de saber onde estaria meu erro para que esse processo unificado não funcione alguém poderia me ajudar?

    segunda-feira, 26 de janeiro de 2015 18:01

Respostas

  • Sim verifiquei nos meus teste estou usando o usuário SA com total privilégio, porem como meu problema era quando insert era realizado e vi que vinha o retorno verifiquei que talvez alguma mensagem exibida no insert pudesse estar frustrando meu progress, após algumas pesquisas encontrei o comando SET NOCOUNT ON que segundo o site da microsoft faz : "Impede que a mensagem que mostra a contagem do número de linhas afetadas por uma instrução Transact-SQL ou por um procedimento armazenado seja retornada como parte do conjunto de resultados."

    Com base nisso resolvi tentar e para minha surpresa o processo retornou os dados como esperado.

    Agradeço a todos pela colaboração.

    • Marcado como Resposta eder.luca quarta-feira, 28 de janeiro de 2015 17:19
    quarta-feira, 28 de janeiro de 2015 17:19

Todas as Respostas

  • Pessoal fazendo alguns testes verifiquei que comentando o insert e executando a procedure via php o processo funciona, se tiro o comentário o mesmo não lista o resultado da procedure la no php, alguma ideia?
    terça-feira, 27 de janeiro de 2015 14:14
  • Deleted
    terça-feira, 27 de janeiro de 2015 14:19
  • Eder.luca,

    Vou na mesma linha de raciocíno do Jose.Diz, você já verificou se o usuário que esta fazendo uso da aplicação no Web tem permissão para escrever nas suas tabelas?


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 28 de janeiro de 2015 11:53
  • Sim verifiquei nos meus teste estou usando o usuário SA com total privilégio, porem como meu problema era quando insert era realizado e vi que vinha o retorno verifiquei que talvez alguma mensagem exibida no insert pudesse estar frustrando meu progress, após algumas pesquisas encontrei o comando SET NOCOUNT ON que segundo o site da microsoft faz : "Impede que a mensagem que mostra a contagem do número de linhas afetadas por uma instrução Transact-SQL ou por um procedimento armazenado seja retornada como parte do conjunto de resultados."

    Com base nisso resolvi tentar e para minha surpresa o processo retornou os dados como esperado.

    Agradeço a todos pela colaboração.

    • Marcado como Resposta eder.luca quarta-feira, 28 de janeiro de 2015 17:19
    quarta-feira, 28 de janeiro de 2015 17:19
  • Eder,

    Então, mas a diretiva SET NOCOUNT ON tem justamente a finalidade de evitar que o SQL Server retorne a contagem de linhas que forma processadas, isso é muito comum de ser utilizado dentro de uma Stored Procedure, com o objetivo de ganho de performance.

    O que pode estar acontecendo é que o PHP não reconhece este tipo de instrução, pois a mesma é nativa do SQL Server.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 28 de janeiro de 2015 17:28
  • Deleted
    quinta-feira, 29 de janeiro de 2015 08:53