2011-11-14 3 views
3

나는 SAS의 작별 인사를하기 위해 R을 배우는 중이다. 나는 아직도 이것에 익숙하지 않고 내가 찾고있는 것을 정확히 찾는 데 어려움을 겪고있다. Pass R variable to RODBC's sqlQuery? 을하고 난 단지 대상 테이블에서 하나 개의 변수를 삽입하고있어 그것을만큼, 자신을 위해 일했다 : 여러 항목이있는 RODBC의 sqlQuery에 R 변수 전달?

하지만이 특정 사건에 대한

, 나는 읽었다. 여기

내 코드입니다 :

[1] "42000 195 [Microsoft][SQL Server Native Client 10.0][SQL Server] 
    'c' is not a recognized built-in function name."  
[2] "[RODBC] ERROR: Could not SQLExecDirect 
    'insert into TestTable (UniqueID) Values (c(8535735, 8449336))'" 

: 나는 다른 번호로 top 1를 교체 할 때의이 top 2을 가정 해 봅시다, 그리고 동일한 코드를 실행

library(RODBC) 
channel <- odbcConnect("test") 
b <- sqlQuery(channel, 
    "select top 1 Noinscr 
    FROM table 
    where PrixVente > 100 
    order by datevente desc") 

sqlQuery(channel, 
    paste("insert into TestTable (UniqueID) Values (",b,")", sep = "") 

, 나는 다음과 같은 오류를 얻을 수 그 여분의 C가 생성되어 있기 때문에 이해, 나는 열을 가정 할 때 : .

을 사용할 때 "c(8535735, 8449336)" 대신 어떻게 "8535735, 8449336"을 얻을 수 있습니까? 아니면 다른 방법이 있습니까?

답변

2

paste() 설명서의 collapse 인수를 살펴보십시오. 아래 그림과 같이 bpaste(b, collapse = ", ")으로 바꾸어보세요.

조슈아가 지적했듯이, sqlQuery는 벡터가 아닌 data.frame을 반환합니다. 따라서 paste(b, collapse = ", ") 대신 paste(b[[1]], collapse = ", ")을 사용할 수 있습니다.

library(RODBC) 
channel <- odbcConnect("test") 
b <- sqlQuery(channel, 
    "select top 1 Noinscr 
    FROM table 
    where PrixVente > 100 
    order by datevente desc") 

sqlQuery(channel, 
    ## note paste(b[[1]], collapse = ", ") in line below 
    paste("insert into TestTable (UniqueID) Values (", paste(b[[1]], collapse = ", "),")", sep = "") 
+0

참고로 축소 매개 변수를 알지 못해서 (그리고 너무 늦게 응답 한) 좀 더 정교한 버전이 있습니다 :'Reduce (function (u, v) paste (u, ",", v, sep = ""), b)' – ROLO

+0

[[1]]을 추가하면 매력처럼 작동합니다! c()가 없어졌습니다! – Felixthecat

2

b 가정하면 다음과 같다 : sqlQuerydata.frame 아닌 벡터를 반환하기 때문에

# in case Noinscr is a factor 
b$Noinscr <- as.character(b$Noinscr) 
# convert the vector into a single string 
# NOTE that I subset to get the vector, since b is a data.frame 
B <- paste(b$Noinscr, collapse=",") 
# create your query 
paste("insert into TestTable (UniqueID) Values (",B,")", sep="") 
# [1] "insert into TestTable (UniqueID) Values (8535735,8449336)" 

당신은 이상한 결과를 얻었다 :

b <- data.frame(Noinscr=c("8535735", "8449336")) 

그런 다음 당신은 단지 몇 단계가 필요합니다. 알다시피, paste을 data.frame (또는 임의의 목록)에 사용하면 이상한 결과가 나타날 수 있습니다. paste은 문자 벡터를 반환해야하기 때문입니다.

+0

저는 여전히 오류가 발생했습니다. 이번에는 텍스트로 변환하고 float 인 SQL 필드에 텍스트를 다시 넣으려고했기 때문에 가정합니다. 이제 다음 오류가 발생합니다. 'closure'를 '문자'유형의 벡터에 강제 변환 할 수 없습니다. – Felixthecat

+0

@Felixthecat : 'paste'가 'b $ Noinscr'을 문자 벡터로 변환하려고 했으므로 숫자 또는 정수 벡터. 이 오류는 함수를 문자 벡터로 변환하려고한다는 것을 의미합니다. 구문을주의 깊게 확인하십시오. –

+0

@Felixthecat : 문제를 해결하려면 질문에'print (b) '의 결과를 게시 할 수 있습니까? – jthetzel