【问题标题】:How to write a parameterized SQL query?如何编写参数化的 SQL 查询?
【发布时间】:2014-11-05 10:05:55
【问题描述】:

我正在尝试使用此查询根据两个条件从 MS SQL 数据库中获取我的值,但我仍然在语法部分遇到异常。

谁能告诉我在 R 中编写参数化查询的正确方法是什么?

以下是我使用的查询:

query<- paste0("SELECT [value] FROM [RiskDashboard].[dbo].[tbl_Simulation]
                  where Row_Id=", row_id[c(1),] ," AND Script_Id=", script_id[c(1),] ,)

T_data<-sqlQuery(ch,query)

print(T_data)

【问题讨论】:

    标签: sql-server r rodbc


    【解决方案1】:

    参数化数据非常重要——尤其是从安全角度来看。您拥有的示例是字符串连接,并且受到 SQL 注入的影响。

    RODBCext 包确实支持参数化。

    第一 - 标准 SQL 参数化语法:

    SELECT ColA, ColB FROM MyTable where FirstName = ? and LastName = ?
    

    每个? 标记按顺序指示将出现在向量中的值。无论平台如何,此语法都适用于 ODBC。其他人已经延伸到支持位置。例如。 OLEDB支持@P1@P2

    虽然对于您的 R 查询可能并不重要 - 在多用户系统中,参数化查询执行得更快,因为查询计划由数据库服务器存储(Oracle 和 SQL Server 都是如此)。

    从文档中半抄袭:

    library(RODBCext)
    connHandle <- odbcConnect("myDatabase")
    data <- sqlExecute(connHandle, "SELECT * FROM myTable WHERE column = ?", 'myValue', fetch = TRUE) 
    odbcClose(connHandle)
    

    文档在这里:https://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html

    更多讨论在这里:Parameterized queries with RODBC

    【讨论】:

      【解决方案2】:

      我得到了正确的方法如下:

      query<- paste0("SELECT [Row_Id],[Script_id],[value] FROM 
      [RiskDashboard].[dbo].      [tbl_Simulation] where Row_Id='",row_id[c(i),],"'
      AND   Script_Id='",script_id[c(i),],"'")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        相关资源
        最近更新 更多