Problema ao usar variáveis SQL Server no PDO

04/08/2015

Quando tento executar qualquer tipo de sentença do SQL Server usando Variável no PDO não retorna nenhum dado.

public function getPercentualBolsa() {
$sql = "DECLARE @CODCOLIGADA INT , @IDPERLET INT , @RA VARCHAR(30) , @CONTCONTRATO INT

SELECT @CONTCONTRATO = COUNT(*),@CODCOLIGADA = C.CODCOLIGADA , @IDPERLET = C.IDPERLET , @RA = C.RA FROM CORPORERM.DBO.SCONTRATO C
INNER JOIN CORPORERM.DBO.SALUNO A ON A.CODCOLIGADA = C.CODCOLIGADA AND A.RA = C.RA
INNER JOIN CORPORERM.DBO.PPESSOA PP ON PP.CODIGO = A.CODPESSOA
INNER JOIN CORPORERM.DBO.SPLETIVO PL ON PL.CODCOLIGADA = C.CODCOLIGADA AND PL.IDPERLET = C.IDPERLET
WHERE PP.CODUSUARIO = '0001789' AND PL.CODPERLET = '2015/2' AND ISNULL(C.STATUS,'') <> 'S'
GROUP BY C.CODCOLIGADA,C.IDPERLET,C.RA

IF
@CONTCONTRATO > 0
BEGIN
SELECT B.NOME,C.DESCONTO,CASE WHEN COUNT(*) > 0 THEN 'SIM' ELSE 'NAO' END BOLSISTA FROM CORPORERM.DBO.SBOLSAALUNO C
INNER JOIN CORPORERM.DBO.SBOLSA B ON B.CODBOLSA = C.CODBOLSA AND B.CODCOLIGADA = C.CODCOLIGADA
WHERE C.RA = @RA AND C.IDPERLET = @IDPERLET AND C.CODCOLIGADA = @CODCOLIGADA
AND C.CODBOLSA IN (2,10)
AND ISNULL(C.ATIVA,'S') = 'S' AND '2015-09-10' BETWEEN C.DTINICIO AND C.DTFIM
GROUP BY B.NOME,C.DESCONTO
END
ELSE
SELECT B.NOME,C.DESCONTO,CASE WHEN COUNT(*) > 0 THEN 'SIM' ELSE 'NAO' END BOLSISTA FROM CORPORERM.DBO.SBOLSAALUNO C
INNER JOIN CORPORERM.DBO.SALUNO A ON A.CODCOLIGADA = C.CODCOLIGADA AND A.RA = C.RA
INNER JOIN CORPORERM.DBO.SPLETIVO PL ON PL.CODCOLIGADA = C.CODCOLIGADA AND PL.IDPERLET = C.IDPERLET
INNER JOIN CORPORERM.DBO.SBOLSA B ON B.CODBOLSA = C.CODBOLSA AND B.CODCOLIGADA = C.CODCOLIGADA
WHERE C.RA = @RA AND C.CODCOLIGADA = @CODCOLIGADA AND PL.CODPERLET = '2015/1'
AND C.CODBOLSA IN (2,10)
AND ISNULL(C.ATIVA,'S') = 'S'
GROUP BY B.NOME,C.DESCONTO

";
$stmt = $this->db->prepare($sql);
$stmt->execute();
return $stmt;
}

já tentei retirar o prepare usando apenas
$stmt = $sql, mas mesmo assim não funciona.

Respostas

04/08/2015

William (devwilliam)

Samuel por gentileza utilize a tag CODE para postar trechos de códigos!

Quanto ao seu código não vi você chamando o "fetch" dos dados, exemplo:

$dados = $stm->fetchAll(PDO::FETCH_OBJ);
Responder Citar

05/08/2015

Samuel Lopes Currículo

estou utilizando assim

#Código

$conexao = new conexao('bd');
$db = $conexao->connect();

$codusuario = $_GET['codusuario'];

$model = new modelAdaptacaoDependencia($db);
$stmt = $model->getPercentualBolsa();

$rw = $stmt->fetchObject();

print $rw->NOME;
Responder Citar

06/08/2015

William (devwilliam)

Samuel, uma sugestão seria criar uma procedure no SQL Server com essas instruções e depois só chamar com PDO.
Responder Citar

06/08/2015

William (devwilliam)

Samuel, uma sugestão seria criar uma procedure no SQL Server com essas instruções e depois só chamar com PDO.
Responder Citar

26/11/2015

Samuel Lopes Currículo

Mesmo usando procedure não funciona

Sentença na procedure


DECLARE PROCEDURE verificaDtAdmissao

as

DECLARE @DIA_SEMANA INT
SET @DIA_SEMANA = (DATEPART(DW,DATEADD(day, 2, getdate())))
SELECT @DIA_SEMANA AS DIAS
 


Código PHP

 public function retornaDiasData($data) {
        $sql = "EXEC verificaDtAdmissao";
        $stmt = $this->db->prepare($sql);
        $stmt->bindParam(":data", $data, PDO::PARAM_STR);
        $stmt->execute();
        $rw = $stmt->fetchObject();
        return $rw->DIAS;
    }


Mesmo assim não me retorna nada

Agora seu eu utilizar assim

 public function retornaDiasData($data) {
        $sql = "SELECT (DATEPART(DW,DATEADD(day, 2, getdate()))) AS DIAS";
        $stmt = $this->db->prepare($sql);
        $stmt->bindParam(":data", $data, PDO::PARAM_STR);
        $stmt->execute();
        $rw = $stmt->fetchObject();
        return $rw->DIAS;
    }


Desta forma funciona. Veja que passei a sentença sem variável. Gostaria de entender porque isto acontece, porque não aceita variáveis nas sentenças com PDO. Se utilizar um mssql_query ao invés de PDO a variável funciona. Pode ser algo relacionado a segurança, mas tem uma boa prática para funcionar?
Responder Citar

26/11/2015

William (devwilliam)

Dá uma olhada nessas vídeos que gravei sobre PDO, entre elas tem uma para executar Procedures e Functions no MySQL:
http://www.devwilliam.com.br/php/curso-php-com-pdo-videos
Responder Citar