none
Erro de concatenação + EXEC RRS feed

  • Pergunta

  • DECLARE @vNomeTabelaGarbage varchar(100),

            @vSql varchar(8000),

            @vCampo1 int,

            @vCampo2 int,

            @vCampo3 int,

            @vCampo4 int

           

            SET @vNomeTabelaGarbage = 'alternatividade_GB'

     

       SELECT @vCampo1 = alternatividade_id,

               @vCampo2 = relacionamaterialfornecedor_id1,

               @vCampo3 = relacionamaterialfornecedor_id2,

               @vCampo4 = empresa

        FROM alternatividade

     

     

          SET @vSql = 'INSERT INTO ' + @vNomeTabelaGarbage + ' (alternatividade_iditem, relacionamaterialfornecedor_id1, '

          SET @vSql = @vSql + 'relacionamaterialfornecedor_id2, empresa, alternatividade_inativo) VALUES (' + @vCampo1

          SET @vSql = @vSql + ', ' + @vCampo2 + ', ' + @vCampo3 + ', ' + @vCampo4 + ', ' + 1 + ')'

     

          EXEC @vSql

     

     

    Conversion failed when converting the varchar value 'INSERT INTO rms_c_alternatividade_GB (alternatividade_iditem, relacionamaterialfornecedor_id1, relacionamaterialfornecedor_id2, empresa, alternatividade_inativo) VALUES (' to data type int.

     

    E ai galera

    Alguem consegue me dizer onde esta o erro da concatenação acima? tem alguma limitação do SQL que eu nao to enxergando?

    Abraços

    terça-feira, 24 de julho de 2007 01:08

Todas as Respostas

  •  

    Olá Rodrigo!

     

    Você concatenando o texto do seu SQL com variáveis INT, para que isso funcione, terá que fazer a conversão dessa variáveis para VARCHAR, exemplo:

     

    ....+ CONVERT (VARCHAR, @vCampo1) + ....

     

    Isso já resolve seu problema.

     

    Agora, um pequeno comentário, recomendo que dê uma lida sobre a utilização da procedure do sistema chamada sp_executesql para fazer a execução de SQL dinâmico ao invés de usar o EXEC (@SQL). Dê uma lida nesse artigo: http://www.sommarskog.se/dyn-search.html que é disparado o melhor sobre SQL dinâmico que já vi até hoje.

     

     

    Grande abraço

    terça-feira, 24 de julho de 2007 01:39
  • Rodrigo,

     

    A recomendação do Alexandre, esta relacionada a utilizar o stored procedure sp_executesql, para montar o plano de execução do SQL Server em uso, quando se utiliza o Exec o SQL Server descarta o plano de execução.

     

    Outro fator importante é que por conseqüência utilizando a sp_executesql a perfomance será melhor.

    terça-feira, 24 de julho de 2007 10:49