Usuário com melhor resposta
Retorno de dados para o PHP

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?
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
Todas as Respostas
-
-
-
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]
-
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
-
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]
-