Pergunta

Mantemos todos os nossos dados de laboratório em um banco de dados Sybase. Quando quero fazer manipulação e análise de dados, leio os dados no R com RODBC.

library(RODBC)
channellab <- odbcConnect("Labdata")
indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen')

Até agora, tudo bem, exceto que CGs.Specimen é uma tabela para toda a nossa participação de laboratório. Existem quase 40000 amostras (linhas) com 66 variáveis. É preciso uma quantidade desnecessária de tempo para ler, especialmente quando estou interessado apenas nas participações de um estudo que possui cerca de 1000 espécimes. A maneira óbvia de consertar seria

indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen WHERE StudyCode="RP"')  

Mas quando eu corro, eu entendo

1] "42S22 -143 [Sybase] [Driver ODBC] [Servidor Adaptive em qualquer lugar] Não encontrada: coluna 'rp' não encontrada" [Rodbc] Erro: não foi possível sqlexecdirect 'selecionar * de cgs.specimen onde Studycode = "RP " '"

Eu brinquei com aspas e brinquei com barras de fuga, mas, infelizmente, não cheguei a lugar algum.

por exemplo

indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen WHERE StudyCode= 'RP'  ')

Erro: Símbolo inesperado em "INDIVs <-SQLQUERY (Channellab, 'Selecione * de CGs.specimen onde StudyCode =' RP"

indivs <-sqlQuery(channellab,"SELECT * from CGS.Specimen WHERE StudyCode= 'RP'  ")

Erro em .Call (C_RODBCFETCHROWS, ATTT (Channel, "handle_ptr"), Max, BuffSize ,: Os vetores de comprimento negativo não são permitidos

O que você sugere?

Foi útil?

Solução

O último erro que você relata é da função .Call para a função C RODBCFETCHROWS. Assim, seu problema com as aspas parece estar resolvido. No entanto, com o referido erro, você ainda tem um problema. Talvez as linhas não sejam relatadas corretamente (a função C tenta alocar vetores com base nesse valor, mas não verifica valores negativos). Tentar:

indivs <-sqlQuery(channellab,"SELECT * from CGS.Specimen WHERE StudyCode= 'RP'", believeNRows = FALSE)

Outras dicas

Editado:

indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen WHERE StudyCode=\'RP\'')  

Ok, você pode executar outra consulta onde alguns dados são retornados?

WHERE StudyCode=StudyCode por exemplo? Isso dá o mesmo erro sobre -ve os comprimentos?

Isso significa que o acima está correto para escapar do StudyCode. O lenght -ve é outro erro. Você pode retornar nem todas as colunas com *, mas colunas específicas onde não há nulos?

Tente opção believenrows = false. Isso funcionou para mim em um erro semelhante (o erro de comprimento negativo).

Esta questão foi mais direta ao ponto:Consultando Oracle DB da Revolução R usando Rodbc

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top