c# - 将运算符传递给存储过程

标签 c# sql sql-server

我有一个 ASP.NET MVC 3 应用程序,它允许用户创建自己的过滤器。类似于 amount > 5 and amount <= 7 , 等等。用户可以选择金额值和运营商。

我的问题是如何将这些过滤器传递给检索数据的存储过程。存储过程已经很复杂了,这意味着传递了很多参数,这些参数被检查为空,所以我不能真正应用我在这里找到的答案:T-SQL Stored Procedure - Dynamic AND/OR Operator

还有其他方法吗?

最佳答案

运算符不能参数化。由于您提到这是一个存储过程,唯一的选择是在 SP 中编写 T-SQL,并使用 sp_executesql,即

//TODO : verify (whitelist) that @operator is in a known set of values...
// '=', '<>', '>', '<' etc - otherwise security risk
declare @sql varchar(4000) = 'select * from Foo where Bar '
          + @operator + ' @value'
exec sp_executesql @sql, N'@value int', @value

这会即时构建查询 (@sql),但始终保持值 (@value) 参数化,因此我们只需要将运算符列入白名单(@operator)。

只是为了展示值如何保持参数化,我们也可以使用:

//TODO : verify (whitelist) that @operator is in a known set of values...
// '=', '<>', '>', '<' etc - otherwise security risk
declare @sql varchar(4000) = 'select * from Foo where Bar '
          + @operator + ' @p'
exec sp_executesql @sql, N'@p int', @value

这里,@pinner sql中的参数名,@valueinner sql中的参数名存储过程sp_executesql 的第三个/第四个/第五个等参数映射到 sp_executesqlsecond 参数中声明的参数(在本例中,声明只是 @p).

请注意,如果这不是存储过程,您可以在 C# 中执行查询构造步骤,再次将值保留为参数。

关于c# - 将运算符传递给存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12691353/

相关文章:

php - 关于动态大小查询的 PDO 和准备好的语句

sql-server - 触发器 - 是否需要 BEGIN/COMMIT TRAN

c# - 如何通过 .NET/C# 查找 CPU 核心数?

c# - log4net 包装器不记录(在 MSTest UT 期间)

c# - 无法从文本框将零转换为int32

MySQL 连接 3 个表 - 从 2 个子表中获取聚合值

c# - ODBC 参数占位符可以命名吗?

python - Pandas DataFrame.to_sql() 错误 - 并非所有参数都在字符串格式化期间转换

c# - 为什么 EF 核心中的 [Timestamp] 列由 byte[] 列而不是 UInt64 支持

c# - SQL Server 2008 - 使用多个关键字和分页的全文搜索