Хранимая процедура не приносит результатов - PullRequest
1 голос
/ 28 марта 2019
  • Моя хранимая процедура не приносит результатов, как это должно быть

  • Все параметры установлены нормально, как и имя моей таблицы (переменное в зависимости от года/month).

  • Когда я выполняю запрос вручную в Management Studio, результаты приходят, но когда я вызываю процедуру на моем контроллере, это не так.

  • PS: код, выполняемый напрямую, с другими датами, но код, выполненный в IDE с указанными датами, тоже должен был принести результат, я пробовал с разными датами, проблема, кажется, взапрос хранимой процедуры.

CONSOLE + CODE PICTURE WITH THE VOID LIST

PICTURE OF THE QUERY WORKING ON MANAGEMENT STUDIO


КОД ХРАНЕННОЙ ПРОЦЕДУРЫ:

ALTER PROCEDURE [dbo].[usp_listarRegistrosMov]
    --PARÂMETROS
    @NomeTabela VARCHAR(20),
    @DataInicial VARCHAR(20),
    @DataFinal VARCHAR(20),
    @Cracha FLOAT
AS
BEGIN
  Declare @Comando Varchar(1000)

  Set @Comando = 'SELECT * FROM ' + @NomeTabela + ' WHERE mov_data BETWEEN ' + @DataInicial + ' AND ' + @DataFinal + ' AND mov_cracha = ' + CAST(@Cracha AS VARCHAR(20))

  Exec(@Comando)
END
GO

КОД КОНТРОЛЛЕРА:

    public void consultar() {
        LocalDate dataInicio = dataInicial.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate dataFim = dataFinal.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        String mesInicio = String.valueOf(dataInicio.getMonthValue());
        String mesFim = String.valueOf(dataFim.getMonthValue());
        String anoInicio = (String.valueOf(dataInicio.getYear())).substring(2,4);
        String anoFim = (String.valueOf(dataFim.getYear())).substring(2,4);
        String empresaString = String.valueOf(Math.round(funcionario.getEmpresa().getCodigo()));
        long mesesDiferencaGlob = ChronoUnit.MONTHS.between(dataInicio, dataFim) + 1;

        if (dataInicio.isAfter(dataFim)) {
            Messages.addGlobalError("Informe uma data inicial posterior à data final");
            return;
        }

        if (dataInicio.getMonthValue() != dataFim.getMonthValue()) {
            if (dataInicio.getYear() == dataFim.getYear()) {
                do {
                    System.out.println(mesesDiferencaGlob);
                    String tabela = ("M00"+(String.valueOf(Math.round(funcionario.getEmpresa().getCodigo())))+anoInicio+"0"+mesInicio);
                    System.out.println(tabela);
                    DateTimeFormatter formatadorInicio = DateTimeFormatter.ofPattern("dd/MM/yyyy");
                    String dataInicioString = dataInicio.format(formatadorInicio);
                    String dataFimString = dataFim.format(formatadorInicio);
                    System.out.println(dataInicioString + dataFimString);
                    setRegistrosTemp(eventoEspelhoPontoRepository.findAllRegistrosByFuncionarioTableUnica(tabela, dataInicioString, dataFimString, funcionario.getCracha()));
                    for (EventoEspelhoPonto item : registrosTemp) {
                        registros.add(item);                        
                    }
                    int mesInicioInt = Integer.parseInt(mesInicio) + 1;
                    mesInicio = Integer.toString(mesInicioInt);
                    mesesDiferencaGlob--;
                } while (mesesDiferencaGlob != 0);      
            }   
        }
}

КОД РЕПОЗИТОРА:

@Query(value = "EXECUTE usp_listarRegistrosMov :tabela, :dataInicial, :dataFinal, :cracha", nativeQuery = true)
List<EventoEspelhoPonto> findAllRegistrosByFuncionarioTableUnica(@Param("tabela") String tabela,
                                                                 @Param("dataInicial") String dataInicial,
                                                                 @Param("dataFinal") String dataFinal,
                                                                 @Param("cracha") Double cracha);

1 Ответ

0 голосов
/ 29 марта 2019

В вашей хранимой процедуре, поскольку вы используете строки для дат в динамической строке SQL, вам необходимо добавить 2 одинарных кавычки вокруг них, чтобы выполняемая строка заключила их в одинарные кавычки.

Другими словами, измените это:

Set @Comando = 'SELECT * FROM ' + @NomeTabela + 
               ' WHERE mov_data BETWEEN ' + @DataInicial + ' AND ' + @DataFinal + ' AND mov_cracha = ' + CAST(@Cracha AS VARCHAR(20))

на это:

Set @Comando = 'SELECT * FROM ' + @NomeTabela + 
               ' WHERE mov_data BETWEEN ''' + @DataInicial + ''' AND ''' + @DataFinal + ''' AND mov_cracha = ' + CAST(@Cracha AS VARCHAR(20))

Я не обещаю, что это ваша единственная проблема, потому что я не говорю на Java, но это определеннопроблема в вашей хранимой процедуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...