使用 exec 或 execute 防止在查询中注入 SQL

Prevent SQL injection in queries with exec or execute

我正在使用 Visual Studio 2017 开发一个报告网站。我所有的 SQL 查询都已参数化并且可以正常工作。问题出在某些具有 exec 命令的查询中,例如在过程中。

例如:

而不是SELECT * FROM tabla WHERE id=@id
我放了 exec('SELECT * FROM tabla WHERE id=@id')

exec 案例不起作用。错误信息是:

Must declare the scalar variable ""@id""." & vbCrLf & "Must declare the scalar variable ""@id""." Anyone knows a possible solution?

非常感谢!

如果您在 "parameterizable" 个位置使用参数(即您不尝试参数化 table/column 个名称),您可以使用 sp_executesql 继续使用参数:

exec sp_executesql N'select * from tabla where id=@id',N'@id int',@id = @id

使用 exec 创建一个无法访问任何外部 variables/parameters 的新上下文,但 sp_executesql 允许您将变量显式传递到内部上下文。 (不要求内部变量名和外部变量名相同,但保持相同通常是最简单的)