none
Concatenação RRS feed

  • Pergunta

  • ALTER PROCEDURE [dbo].[teste]
    AS
    BEGIN
       
        DECLARE @cod_empresa varchar(2);

        SET @cod_empresa = '01';

        SELECT cod_embal
          FROM OPENQUERY(PRODUCAO, 'SELECT cod_embal
                                      FROM logix.item_embalagem
                                      WHERE cod_empresa = '''@cod_empresa'''');

    END

    Qual a forma correta de concatenar a variavel @cod_empresa ao SQL acima. Já tentei de todas as formas que conheço e não funcionou.

    Agradeço desde já.

    Marco A. Justo
    segunda-feira, 17 de dezembro de 2007 15:28

Todas as Respostas

  • Marco,

     

    Veja se este exemplo ajuda:

     

        SELECT cod_embal
          FROM OPENQUERY(PRODUCAO, 'SELECT cod_embal
                                      FROM logix.item_embalagem
                                      WHERE cod_empresa = +''''@cod_empresa'''');

    segunda-feira, 17 de dezembro de 2007 15:53
    Moderador
  • Cara valeu pela dica, mas não funcionou ainda.
    segunda-feira, 17 de dezembro de 2007 16:05
  • Marco,

     

    Mas o que esta dando de errado?

    segunda-feira, 17 de dezembro de 2007 16:23
    Moderador
  • Boa Tarde,

     

    Se estamos utilizando o SQL Server 2005, acho melhor utilizar as construções mais próprias para isso. Dê uma olhada no exemplo abaixo:

     

    DECLARE @cmdSQL VARCHAR(100)

    SET @cmdSQL = 'SELECT cod_embal FROM logix.item_embalagem '

    SET @cmdSQL = @cmdSQL + 'WHERE cod_empresa = ' + cast(@cod_empresa as int)

    EXECUTE (@cmdSQL) AT PRODUCAO

     

    [ ]s,

     

    Gustavo

    segunda-feira, 17 de dezembro de 2007 16:30
  • Gustavo,

     

    Pode ser, mas em particular em nunca percebi diferença entre utilizar este tipo de construção ou fazer conforme foi postado anteriormente.

    segunda-feira, 17 de dezembro de 2007 16:49
    Moderador
  • Na verdade ele compila a procedure normalmente, mas quando  executa, não reconhece o valor da variavel e me retorna vazio.
    segunda-feira, 17 de dezembro de 2007 17:04
  • Oi Jr,

     

    Postei uma outra construção por ser mais simples e mais fácil de debugar. O código em que vocês estão trabalhando não irá funcionar. Há um detalhe nas aspas. Há quatro aspas na antes de @cod_empresa e cinco após @codempresa. Mesmo que a quantidade estivesse correta ,seria necessário concatenar também a variavél @codempresa. Ex:

     

    SELECT cod_embal

    FROM OPENQUERY(PRODUCAO, 'SELECT cod_embal

    FROM logix.item_embalagem

    WHERE cod_empresa = ' + '''' + @cod_empresa + '''');

     

    Só que esse tipo de código não funciona. Você teria que criar uma string dinâmica para executar o OPENQUERY. Ex:

     

    DECLARE @cod_empresa VARCHAR(100)

    DECLARE @cmdSQL VARCHAR(1000)

    SET @cod_empresa = 'cod1'

    SET @cmdSQL = 'SELECT cod_embal FROM OPENQUERY(PRODUCAO,'

    SET @cmdSQL = @cmdSQL + ''''

    SET @cmdSQL = @cmdSQL + 'SELECT cod_embal FROM logix.item_embalagem WHERE cod_empresa = '

    SET @cmdSQL = @cmdSQL + '''' + '''' + @cod_empresa + '''' + '''' + '''' + ')'

    PRINT @cmdSQL

    EXEC (@cmdSQL)

     

    Considerando a simplicidade e facilidade que a outra construção possui, eu não utilizaria o OPENQUERY. Acho bem melhor trabalhar com o EXEC AT (novo no 2005). É apenas uma questão de preferência.

     

    [ ]s,

     

    Gustavo

    segunda-feira, 17 de dezembro de 2007 17:07
  • Olá Marco,

     

    Ele não irá reconhecer sua variável. Quando você a declarou, você estava na sessão externa. A SQL dinâmica vai rodar como uma sessão interna e o que está interno não enxerga o que está externo e vice-versa.

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 17 de dezembro de 2007 17:08
  • Gustavo,

    fazendo desta forma retorna o seguinte erro:

    Server 'PRODUCAO' is not configured for RPC.

    Tem idéia do que seria isso?

    Marco A. Justo
    segunda-feira, 17 de dezembro de 2007 17:10
  • Olá Marco,

     

    Vá nas propriedades do seu Linked Server e habilite o RPC (geralmente ele já vem habilitado).

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 17 de dezembro de 2007 17:17
  • Gustavo,

     

    Certo, em relação as aspas é um mero detalhe que pode ser resolvido.

     

    Em relação a string dinâmica, eu concordo, somente quis respeitar o código que o nosso amigo postou.

    segunda-feira, 17 de dezembro de 2007 17:26
    Moderador
  • Cara valeu mesmo, desta forma funcionou.

    Agradeço muito mesmo.

    Marco A. Justo
    segunda-feira, 17 de dezembro de 2007 17:28
  • Marco,

     

    E assim também deve funcionar:

     

    Code Block

    SELECT cod_embal

    FROM OPENQUERY(PRODUCAO, 'SELECT cod_embal

    FROM logix.item_embalagem

    WHERE cod_empresa = +''''@cod_empresa''''');

     

     

    segunda-feira, 17 de dezembro de 2007 17:30
    Moderador
  • Oi Jr,

     

    Claro com certeza. Eu também iria na mesma linha que você. É só porque daquela forma fica um pouco mais difícil... No entanto, são possibilidades que funcionam certamente. Se fosse 2000, a solução era a melhor mesmo.

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 17 de dezembro de 2007 18:05
  • Oi Marco,

     

    Que bom que a discussão conjunta gerou uma solução satisfatória.

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 17 de dezembro de 2007 18:06
  • Gustavo,

     

    É isso ai.

     

    segunda-feira, 17 de dezembro de 2007 19:13
    Moderador