2017-10-18 70 views
0

您好,我希望通过R连接将以下数据粘贴到SQL查询中。SQL查询的单引号R

UKWinnersID<-c("1W167X6", "QM6VY8", "ZDNZX0", "8J49D8", "RGNSW9", 
"BH7D3P1", "W31S84", "NTHDJ4", "H3UA1", "AH9N7", 
"DF52B68", "K65C2", "VGT2Q0", "93LR6", "SJAJ0", 
"WQBH47", "CP8PW9", "5H2TD5", "TFLKV4", "X42J1") 

查询/ R中的代码是如下:

UKSQL6<-data.frame(sqlQuery(myConn, paste("SELECT TOP 10000 [AxiomaDate] 
         ,[RiskModelID] ,[AxiomaID],[Factor1],[Factor2],[Factor3],[Factor4],[Factor5] 
         ,[Factor6],[Factor7],[Factor8],[Factor9],[Factor10],[Factor11],[Factor12] 
         ,[Factor13],[Factor14],[Factor15]FROM [PortfolioAnalytics].[Data_Axioma].[SecurityExposures] 
         Where AxiomaDate IN (
         SELECT MAX(AxiomaDate) 
         FROM  [PortfolioAnalytics].[Data_Axioma].[FactorReturns] 
            GROUP BY MONTH(AxiomaDate), YEAR(AxiomaDate)) 
         AND RiskModelID = 8 
         AND AxiomaID IN(",paste(UKWinnersID, collapse = ","),")"))) 

我在上面的代码的最后一行粘贴UKWinnersID但UKWinnersID的该格式需要是作为('1W167X6 ','QM6VY8','ZDNZX0'等),只有一个单引号,我不能上班。

+1

的字符串并不是在所有的报价,这将失败(在所有SQL引擎中,我认为)。尝试粘贴(sQuote(UKWinnersID),​​...'或'粘贴(dbQuoteString(UKWinnersID),​​...'。 – r2evans

+0

.... paste(sQuote(UKWinnersID),​​collapse =“,”),“)”) ))将曲线引号('1W167X6','QM6VY8')而不是'直线'引号(即'1W167X6','QM6VY8')粘贴到我想要的值上? – user8491385

+1

先运行这个,然后'引用'会给你直线引号:'options(useFancyQuotes = FALSE)' –

回答

0

考虑使用RODBCext包(RODBC的扩展)运行parameterized query,假设这是使用的API。参数化查询所做的不仅仅是从SQL注入隔离,而是从代码中提取数据并避免混乱的引用框和字符串插入和串联,以实现更清洁,可维护的代码。

以下替换您TOP 10000TOP 500每个20个IDS的:

library(RODBC) 
library(RODBCext) 

conn <- odbcConnect("DBName", uid="user", pwd="password") 

ids_df <- data.frame(UKWinnersID = c("1W167X6", "QM6VY8", "ZDNZX0", "8J49D8", "RGNSW9", 
            "BH7D3P1", "W31S84", "NTHDJ4", "H3UA1", "AH9N7", 
            "DF52B68", "K65C2", "VGT2Q0", "93LR6", "SJAJ0", 
            "WQBH47", "CP8PW9", "5H2TD5", "TFLKV4", "X42J1")) 

# SQL STATEMENT (NO DATA) 
query <- "SELECT TOP 500 [AxiomaDate], [RiskModelID], [AxiomaID], [Factor1],[Factor2] 
       , [Factor3], [Factor4], [Factor5], [Factor6], [Factor7], [Factor8] 
       , [Factor9], [Factor10], [Factor11], [Factor12] 
       , [Factor13], [Factor14], [Factor15] 
      FROM [PortfolioAnalytics].[Data_Axioma].[SecurityExposures] 
      WHERE AxiomaDate IN (
        SELECT MAX(AxiomaDate) 
        FROM  [PortfolioAnalytics].[Data_Axioma].[FactorReturns] 
        GROUP BY MONTH(AxiomaDate), YEAR(AxiomaDate) 
       ) 
      AND RiskModelID = 8 
      AND AxiomaID = ?" 

# PASS DATAFRAME VALUES TO BIND TO QUERY PARAMETERS 
UKSQL6 <- sqlExecute(conn, query, ids_df, fetch=TRUE) 

odbcClose(conn) 

或者,如果你真的需要使用IN()条款:

# SQL STATEMENT (NO DATA) 
query <- paste("SELECT TOP 10000 

        ...same as above... 

        AND AxiomaID IN (", paste(rep("?", nrow(ids_df)), collapse=", "), ")") 

# TRANSPOSE DATA FRAME FOR COLUMN EQUAL TO ? PLACEHOLDERS 
UKSQL6 <- sqlExecute(conn, query, t(ids_df), fetch=TRUE)