none
erro numa consulta com linked service do sql para o mysql RRS feed

  • Pergunta

  • Olá pessoal,

    Estou tento um problema e gostaria de saber se alguém por acaso já passou por isso e conseguiu achar a solução.

    Estou fazendo essa consulta em um banco de dados.

    SELECT * FROM OPENQUERY(ServMysql,'
    SELECT l.filename,u.name,u.username,l.date_time,l.idcontent
    FROM bancodados.portal_content_log l
    inner join bancodados.portal_users u on l.iduser = u.id 
    where l.filename <> '' and l.idcontent <> -1  and l.date_time BETWEEN '2013-01-01' AND '2013-02-21' ')

    quando executo aparece o seguinte erro.

    Line 6: Incorrect syntax near '2013'.

    só que o script funciona direitinho quando executo no servidor do Mysql.

    e quando tiro o BETWEEN o erro é pior ainda.


    SELECT * FROM OPENQUERY(SPSVMYSQL01,'
    SELECT l.filename,u.name,u.username,l.date_time,l.idcontent
    FROM db_portal_sebrae.portal_content_log l
    inner join db_portal_sebrae.portal_users u on l.iduser = u.id 
    where l.filename <> '' and l.idcontent <> -1  ')

    erro :

    [OLE/DB provider returned message: [MySQL][ODBC 5.1 Driver][mysqld-5.5.27]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' and l.idcontent <> -1' at line 4]
    OLE DB error trace [OLE/DB Provider 'MSDASQL' IColumnsInfo::GetColumnsInfo returned 0x80004005:   ].
    Msg 7399, Level 16, State 1, Line 1
    OLE DB provider 'MSDASQL' reported an error.  

    quinta-feira, 28 de fevereiro de 2013 21:12

Respostas

  • Bom dia AdalVitor,

    O erro está sendo causado devido à sintaxe. No caso de uma OPENQUERY, devemos lembrar dos caracteres de escape, no caso, as duas aspas simples e prestar bastante atenção nas aspas simples que abrem a consulta, a que antecede o SELECT e a que antecede o ) final.

    Exemplo de um código testado que possui o escapamento correto:

    USE MASTER
    GO
    SELECT * FROM OPENQUERY(WORLD,
    'SELECT pais.Name as Pais, cidade.Name as Cidade 
    FROM world.country as pais
    inner join world.city as cidade on cidade.CountryCode = pais.Code
    WHERE cidade.district = ''Kabol'' ')

    Como seu SQL está correto, inclusive o BETWEEN que é ANSI, foque apenas nas aspas e o problema deve ser resolvido

     BETWEEN ''2013-01-01'' AND ''2013-02-21'' ')
    Abraço!


    • Editado Renato Siqueira sábado, 2 de março de 2013 03:17 Formatar post
    • Sugerido como Resposta Renato Siqueira sábado, 2 de março de 2013 03:53
    • Marcado como Resposta Adalvitor quarta-feira, 13 de março de 2013 17:56
    sábado, 2 de março de 2013 03:14

Todas as Respostas

  • se voce fizer a mesma coisa mas sem condição nenhuma, um select * na tabela funciona ? se funcionar pode ser alguma sintaxe do mysql que é diferente a do sql server...

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 28 de fevereiro de 2013 21:28
  • Sim funciona.... tirei as restrições e me trouxe o resultado.

    mas sera q nao tem nenhuma outra forma ?

    quinta-feira, 28 de fevereiro de 2013 21:59
  • Cara,

    Creio que o seu problema esteja na linha em negrito:

    SELECT * FROM OPENQUERY(ServMysql,' SELECT l.filename,u.name,u.username,l.date_time,l.idcontent FROM bancodados.portal_content_log l inner join bancodados.portal_users u on l.iduser = u.id

    where l.filename ''

    and l.idcontent <> -1 and l.date_time BETWEEN '2013-01-01' AND '2013-02-21' ')

    Tente:

    where l.filename IS NOT NULL

    E verifique se é possível ser menor que -1 na coluna idcontent, caso não:

    and l.idcontent > -1

    Caso não resolva, pode existir o erro de sintaxe como o Alexandre disse a cima.


    Atenciosamente, Samuel dos Anjos

    quinta-feira, 28 de fevereiro de 2013 23:15
  • Bom dia AdalVitor,

    O erro está sendo causado devido à sintaxe. No caso de uma OPENQUERY, devemos lembrar dos caracteres de escape, no caso, as duas aspas simples e prestar bastante atenção nas aspas simples que abrem a consulta, a que antecede o SELECT e a que antecede o ) final.

    Exemplo de um código testado que possui o escapamento correto:

    USE MASTER
    GO
    SELECT * FROM OPENQUERY(WORLD,
    'SELECT pais.Name as Pais, cidade.Name as Cidade 
    FROM world.country as pais
    inner join world.city as cidade on cidade.CountryCode = pais.Code
    WHERE cidade.district = ''Kabol'' ')

    Como seu SQL está correto, inclusive o BETWEEN que é ANSI, foque apenas nas aspas e o problema deve ser resolvido

     BETWEEN ''2013-01-01'' AND ''2013-02-21'' ')
    Abraço!


    • Editado Renato Siqueira sábado, 2 de março de 2013 03:17 Formatar post
    • Sugerido como Resposta Renato Siqueira sábado, 2 de março de 2013 03:53
    • Marcado como Resposta Adalvitor quarta-feira, 13 de março de 2013 17:56
    sábado, 2 de março de 2013 03:14
  • No final deu certo, o problema tava no sintaxe mesmo, teria que usar aspas duplas ao invés de aspas simples.
    quarta-feira, 13 de março de 2013 17:57