如何编写参数化的 SQL 查询?

Posted

技术标签:

【中文标题】如何编写参数化的 SQL 查询?【英文标题】:How to write a parameterized SQL query? 【发布时间】: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)

【问题讨论】:

【参考方案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),],"'")

【讨论】:

以上是关于如何编写参数化的 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用用户输入和通配符编写 sql 查询

使用参数化的 SqlCommand 是不是使我的程序免受 SQL 注入的影响?

使用带有乘数函数的数据适配器编写更新 SQL 查询

如何使用sql编写查询语句 用于查询学生的 各科成绩

参数化的 SQL 列?

如何将参数传递给SQL(Excel)中的查询