ERRO INVALID EXPRESSION NEAR ANYWHERE

 Tópico anterior Próximo tópico Novo tópico

ERRO INVALID EXPRESSION NEAR ANYWHERE

C#

 Compartilhe  Compartilhe  Compartilhe
#494958 - 15/09/2020 14:49:18

MARCOSPINHEIRO
PINDA
Cadast. em:Agosto/2015


Última edição em 15/09/2020 14:56:19 por MARCOSPINHEIRO

Boa tarde pessoal!
Estou de cabelos em pés e não consigo resolver isso.
Vamos a questão:
Tenho uma procedure no Sybase (anywhare) versão 12.1 que
simplesmente insere ou altera informações.
Eis a dita cuja abaixo:

ALTER PROCEDURE 'DBA'.'p_imp_tiss_procedimentos'( in tabela_x varchar(2),in codigo_x varchar(10),
  in descricao_x varchar(300),in ref_fabricante_x varchar(20),in fabricante_x varchar(300),
  in apresentacao_x varchar(300),in laboratorio_x varchar(300),in dt_ini_vigencia_x date,in dt_fim_vigencia_x date )
begin
  if f_imp_tiss_procedimentos_qtd(tabela_x,codigo_x) = 0 then
    insert into tab_av_procedimentos( tabela,codigo,descricao,ref_fabricante,fabricante,apresentacao,laboratorio,dt_ini_vigencia,dt_fim_vigencia ) values
      ( tabela_x,codigo_x,descricao_x,ref_fabricante_x,fabricante_x,apresentacao_x,laboratorio_x,dt_ini_vigencia_x,dt_fim_vigencia_x )
  else
    update tab_av_procedimentos
      set descricao = descricao_x,
      ref_fabricante = ref_fabricante_x,
      fabricante = fabricante_x,
      apresentacao = apresentacao_x,
      laboratorio = laboratorio_x,
      dt_ini_vigencia_x = dt_ini_vigencia_x,
      dt_fim_vigencia = dt_fim_vigencia_x
      where tabela = tabela_x and codigo = codigo_x
  end if;
  
end


Pois bem...

Se chamarmos a procedure direto do Interactive SQL funciona normalmente.
Porém, se eu chamar do sistema (C#), com o ADO.NET, dá o seguinte erro:
Invalid expression near 'dt_ini_vigencia_x'

dt_ini_vigencia_x é um parâmetro da procedure.

Antes, a procedure não tinha a data como parâmetro e o sistema
funciona normalmente, executando a procedure. Foi somente implementada
os parâmetros do tipo data que o erro iniciou.

Se usar um insert into ou update direto no commandtext, funcionando normalmente tbm.

Já tentei executar a procedure das seguintes formas:
1º forma
SACommand cmd = new SACommand('p_imp_tiss_procedimentos', cx.Conexao())
                    {
                        CommandType = CommandType.StoredProcedure    
                    };

                     cmd.Parameters.AddWithValue('@tabela_x', tabela_x);
                    cmd.Parameters.AddWithValue('@codigo_x', codigo_x);
                    cmd.Parameters.AddWithValue('@descricao_x', descricao_x);
                    cmd.Parameters.AddWithValue('@ref_fabricante_x', ref_fabricante_x);
                    cmd.Parameters.AddWithValue('@fabricante_x', fabricante_x);
                    cmd.Parameters.AddWithValue('@apresentacao_x', apresentacao_x);
                    cmd.Parameters.AddWithValue('@laboratorio_x', laboratorio_x);
                    //cmd.Parameters.AddWithValue('@dt_ini_vigencia_x', dt_inicio_vigencia_x);
                    //cmd.Parameters.AddWithValue('@dt_fim_vigencia_x', dt_fim_vigencia_x);
                    cmd.Parameters.AddWithValue('@dt_ini_vigencia_x', SADbType.DateTime).Value = DateTime.Parse('2000-01-01');
                    cmd.Parameters.AddWithValue('@dt_fim_vigencia_x', SADbType.DateTime).Value = DateTime.Parse('2000-01-01');
                    //cmd.Parameters.AddWithValue('@dt_ini_vigencia_x',  SADbType.Date).Value = Convert.ToDateTime('2000-01-01');

                  cmd.CommandText = strProcedure;

                    if (cx.Conecatada() == false)
                    {
                        cx.Conectar();
                    }

                    cmd.ExecuteNonQuery();


2º forma

SACommand cmd = new SACommand('p_imp_tiss_procedimentos', cx.Conexao())
                    {
                        CommandType = CommandType.Text
                    };

                    strProcedure = 'CALL p_imp_tiss_procedimentos('99','9999999999','descricao teste','ref do fabricante','zodiac','apresentacao teste','laboratorio teste',1983-07-07,2000-01-01)';

                    cmd.CommandText = strProcedure;


Alguns comentários nos códigos foram algumas das enumeras maneiras que tentei e não consegui, sempre da o mesmo erro.

Enfatizo:  que a procedure funciona normalmente se chamada a partir do Interactive SQL (IDE da Sybase).
Enfatizo ainda que, sem os parâmetros datas, funciona formalmente também no sistema.

Alguma luz? Grato por todo aquele que ajudar.





Marcos Pinheiro

#494960 - 15/09/2020 15:14:52

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
O nome do campo é mesmo 'dt_ini_vigencia_x '?

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#494961 - 15/09/2020 15:24:36

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Além disso, não sei se a tabela pode ser dinâmico assim. Geralmente quando se salva SP's ele verifica todos os nomes de campos e tabelas pra ver se estão corretos.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#494962 - 15/09/2020 16:00:10

MARCOSPINHEIRO
PINDA
Cadast. em:Agosto/2015


Grato Kerplunk, mas a procedure funciona normalmente se chamada do Interactive SQL. Não da erros. Inseri os dados normalmente ou os atualiza.

Marcos Pinheiro

#494963 - 15/09/2020 16:37:45

DAMASCENO.CESAR
ADAMANTINA
Cadast. em:Fevereiro/2009


  if f_imp_tiss_procedimentos_qtd(tabela_x,codigo_x) = 0 then
    insert into tab_av_procedimentos( tabela,codigo,descricao,ref_fabricante,fabricante,apresentacao,laboratorio,dt_ini_vigencia,dt_fim_vigencia ) values
      ( tabela_x,codigo_x,descricao_x,ref_fabricante_x,fabricante_x,apresentacao_x,laboratorio_x,dt_ini_vigencia_x,dt_fim_vigencia_x )
  else
    update tab_av_procedimentos
      set descricao = descricao_x,
      ref_fabricante = ref_fabricante_x,
      fabricante = fabricante_x,
      apresentacao = apresentacao_x,
      laboratorio = laboratorio_x,
      dt_ini_vigencia_x = dt_ini_vigencia_x,
      dt_fim_vigencia = dt_fim_vigencia_x
      where tabela = tabela_x and codigo = codigo_x
  end if;


Se voce fez um CTRL + C --> CTRL + V do código, o campo esta com o mesmo nome do parametro, seu campo é com nome diferente

O conhecimento como o dinheiro: quanto mais temos, mais queremos ter (Josh Billings)  


#494965 - 16/09/2020 07:39:23

MARCOSPINHEIRO
PINDA
Cadast. em:Agosto/2015


Meus amigos, os testes diretos que fiz foram insert e não update.

Finalmente depois dos olhos clínicos do KERPLUNK e do DAMASCENO.CESAR, realmente o erro só pode estar
no campo dt_ini_vigencia_x, que dever ser apenas dt_ini_vigencia.

Como o DBA (que tbm é o analista de sistemas) está de férias, vou aguardar ele chegar para solicitar a revisão/correção
de sua procedure. Obs.: É meu chefe ...

Marcos Pinheiro

 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário